C++中一维数组和二维数组中的指针总结

首先区别清楚指针数组和数组指针的区别

以名字后面的两个字定性:

1.指针数组是一个数组,存贮着指针类型的变量,例如:

int *a[10];

因为[]的优先级大于*,故首先是一个含有10个元素的数组,数组中的元素是指向int类型的指针;

2.数组指针是一个指针,指向的对象是一个数组,例如:

int (*a)[10];

因为()的优先级大于[],故先确定a是一个指针,指向的数据类型是一个含有10个int型数据的数组。

3.指向一维数组中的指针

首先我们先看一个一维数组:

    int a[3]={1,2,3};//a是一个数组的名称
    cout<<*a<<endl;//对a进行解引用,结果就是数组中第一个元素的值
    cout<<a<<endl;//a是数组第一个元素的地址
    cout<<a[0]<<endl;//a[0]代表第一个元素
    cout<<&a<<endl;//&a是代表取整个数组的地址,整个数组的地址和第一个元素的地址是一样的
    cout<<&a[0]<<endl;//对第一个元素取地址
输出如下:
    1
    0x7ffcf78f5680
    1
    0x7ffcf78f5680
    0x7ffcf78f5680

指针指向的数据类型是一维数组,例如:

    int *a;
    int p[3] ={1,2,3};
    a=p;
    cout<<*a<<endl;//a=p,p代表一位数组中的首个元素的地址,*a为第一个元素的值
    cout<<a<<endl;//a为第一个元素的值
    cout<<&a<<endl;//&a对a取地址,得到的是指针a的存贮地址
    cout<<&a[0]<<endl;//对a的首个元素取地址
    cout<<&p[0]<<endl;//对a的首个元素取地址
    cout<<&p<<endl;//对数组p的整体取地址,数组整体的地址就是首个元素的地址

 输出结果如下:

1
0x7ffd9a983420
0x7ffd9a983418
0x7ffd9a983420
0x7ffd9a983420
0x7ffd9a983420


4.二维数组的指针:

扫描二维码关注公众号,回复: 8764900 查看本文章

如下,例一:

    int x[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};

    int (*p)[3] = x;  //在声明的时候,这里指p是这样一种指针类型:(*)[3],即指向3个int的指针(每次自增1的长度为3个int的长度)。不要做其他理解!!

    cout << x << endl;
    cout << (*p)[3] << endl;
    cout << *p[3] << endl;  // []的优先级高于*,所以先解释为p[3],即*(p+3),而p是指向3个int的指针,所以p+3指向{10,11,12}(即保存{10,11,12}的地址),所以*(p+3)(即p[3])为10的地址,所以*p[3](即*(*(p+3)))为10
    cout << *(*(p+3)) << endl;
    cout <<&x<<endl;
    cout <<&x[0][0]<<endl;
输出如下:
    0x7fff5f4d5620
    4
    10
    10
    0x7fff5f4d5620
    0x7fff5f4d5620


例二:


    int a[2][3]={{1,2,3},{4,5,6}};
    int(*k)[3];
    k=a;
    cout<<"*(k+1)"<<*(k+1)<<endl;
    cout<<"*(*k+1)"<<*(*k+1)<<endl;
    cout<<"*(*(k+1))"<<*(*(k+1))<<endl;
    cout<<endl;
    cout<<"(k+1)"<<(k+1)<<endl;
    cout<<"(*k+1)"<<(*k+1)<<endl;
    cout<<"(*(k+1))"<<(*(k+1))<<endl;
    cout<<endl;
    cout<<"&k"<<&k<<endl;
    cout<<"*k"<<*k<<endl;
    cout<<"k"<<k<<endl;
    cout<<endl;
    cout<<"&a"<<&a<<endl;
    cout<<"*a"<<*a<<endl;
    cout<<"a"<<a<<endl;
输出如下:
    *(k+1)0x7ffe492326ac
    *(*k+1)2
    *(*(k+1))4

    (k+1)0x7ffe492326ac
    (*k+1)0x7ffe492326a4
    (*(k+1))0x7ffe492326ac

    &k0x7ffe49232698
    *k0x7ffe492326a0
    k0x7ffe492326a0

    &a0x7ffe492326a0
    *a0x7ffe492326a0
    a0x7ffe492326a0

发布了18 篇原创文章 · 获赞 0 · 访问量 7089

猜你喜欢

转载自blog.csdn.net/gaoxiaobai666666/article/details/104063933