首先区别清楚指针数组和数组指针的区别
以名字后面的两个字定性:
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