zoukankan      html  css  js  c++  java
  • C/C++语言指针用法详解 (六) 指针和数组

    标明出处,欢迎转载!!!

    知识至上,欢迎指正!!!


    1.定义

    指针和数组基本等价的原因在于指针算术和C++内部处理数组的方式。  ——《C++PrimerPlus》第五版

    在多数情况下,C++将数组名解释为数组中第一个元素的地址。

       int arr[10] = {1,2,3,4,5};
       int *p = arr;
       cout<<" -------------- 3 种方式得到数组的地址 ------------------- "<<endl;
       cout<<"arr     -> "<<arr<<endl;
       cout<<"&arr[0] -> "<<&arr[0]<<endl;
       cout<<"p       -> "<<p<<endl;
       cout<<" -------------- 4 种方式得到数组的值 ------------------- "<<endl;
       cout<<"arr[1]     -> "<<arr[1]<<endl;
       cout<<"*(arr+1)   -> "<<*(arr+1)<<endl;
       cout<<"*(p+1)     -> "<<*(p+1)<<endl;
       cout<<"p[1]       -> "<<p[1]<<endl;
    

     

    总结:

    arrayname[i]    等价于  *(arrayname+i)  

    2.指针数组和数组指针

    这部分参考微博:http://www.cnblogs.com/Romi/archive/2012/01/10/2317898.html

    指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针

    数组指针:a pointer to an array,即指向数组的指针

    还要注意的是他们用法的区别,下面举例说明。

    int* a[4]     指针数组     

                     表示:数组a[4]是指针,指针的类型是int*,指针的指向类型是int

                     元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

    int (*a)[4]   数组指针     

                     表示:a是指针的类型是int*[4], 指针的指向的类型为int()[4]

                     元素表示:(*a)[i]  

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
       /***   指针数组
        ** <数组 pstr[3],数组的元素是指针>  三省指针:指针的类型是 int * ,指向的类型是int ,数组内每个指针分别指向 三个字符串的首地址
        ***/
       char *pstr[3] = {
        "Socialism",
        "with",
        "Chinese"
       };
       cout<<" pstr[0]  "<<pstr[0][0]<<endl;;
       cout<<" pstr[1]  "<<pstr[1]<<endl;;
       cout<<" pstr[2]  "<<pstr[2]<<endl;;
    
       /***   数组指针
        ** <指针 pstr1>  三省指针:指针的类型是 int (*)[20] ,指向的类型是int()[20] ,指针指向 str1
       ***/
       char str1[20] = "Characteristics";
       char (*pstr1)[20] = &str1;
       //b=&str1;
       cout<<" *pstr1   "<<*pstr1<<endl;;
    }
    

     

    注意:字符串相当于一个数组常量,内容不可改变,且只能为右值,如果看成指针,即是常量指针也是指针常量

    指针常量:该指针是一个常量,不可改变,指向某一个地址就不能改变,但是0指向的单元是可以改变的,一般读做常量指向

    常量指针:指针的值不能改变,但是自身是一个变量,读作指向常量

    3.数组首地址的总结

    数组名是数组的首地址

    a)含义:

    声明一个数组  :   TYPE  arrayname[N];

    有两层含义:1.arrayname是一个数组,类型是TYPE[N]

                          2.array是一个常量指针,指针的类型是TYPE *,指向类型是TYPE,指向的值是数组的第0号元素,注意arrayname和数组第0号元素的地址是不同的,arrayname是指针常量,arrayname++是错误的。

    b)功能

    sizeof(arrayname)   &arrname   arrayname代表的是数组本身,得到的是整个数组的大小 此时  &arrname 表示的是 指向是整个数组
    *arrayname (等同 arrayname[0])  arrayname代表的是指针,得到的是数组第0号元素的值
    arrayname+i arrayname代表的是指针,得到的是指针向后偏移i个指向类型的单位的指针

    补充:sizeof(对象)测出的都是对象自身的类型大小

  • 相关阅读:
    Github简单使用
    软件架构
    软件架构
    软件架构
    VB.net 捕获项目全局异常
    C#里面的三种定时计时器:TIMER
    深入分析委托与事件
    C#预处理器指令
    C# 实现透明可移动窗体
    多元一次方程解法 C++
  • 原文地址:https://www.cnblogs.com/sxy-798013203/p/7754858.html
Copyright © 2011-2022 走看看