1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <iostream.h> int a[][3]={1,2,3,4,5,6,7,8,9}; int *p[]={a[0],a[1],a[2]}; int **pp=p; void main() { int (*s)[3]=a,*q=&a[0][0]; for(int i(1);i<3;i++) for(int j(0);j<2;j++) { cout<<*(a[i]+j)<<','<<*(*(p+i)+j)<<','<<(*(pp+i))[j]<<','; cout<<*(q+3*i+j)<<','<<*(*s+3*i+j)<<endl; }
cout<<*s<<','<<s[0]<<endl; }
/* (1)运行结果分析 4,4,4,4,4 5,5,5,5,5 7,7,7,7,7 8,8,8,8,8 Press any key to continue *(a[i]+j)表示第i+1+j行第一列元素 *(*(p+i)+j):p是二级指针,p+i表示第i行地址,也是二级指针,通过*降维,然后加j表示第i行第j+1列元素地址,再用*降维 (*(pp+i))[j]:(*(pp+i))的效果其实就是a[i], *(q+3*i+j):q是一维指针,所以该式表示的是从q指向的元素向后移动3*i+j个元素 *(*s+3*i+j):s和p是一样的,*s表示的是一个一维的数组的首地址,即*s和q是等价的。
(3) a[0]+1表示的是第一行第二列的元素的地址,因为a[0]是一个一维的指针,即a[0]表示的是从数组的第一个元素开始的一个一维数组的首地址 *(p+1)+1表示第二行第二列元素的地址,因为p是二维指针,p+1表示的是二维中的第一维加一,即p+1表示的是第二行元素,通过*进行降维后再加一即为第二列的元素地址 *(pp+1)[1]表示第二行第二列元素 q+3表示第四个元素的地址,即4的地址 *s+3表示第4个元素的地址
(4) p是指针数组,s是指向数组的指针。p[]是一个数组空间的,只不过这个数组的每个空间是用来存储的地址的,而s是一个指针,指向的是一个数组空间。
*/
|