【C/C++】深入理解指针和数组的关系
对数组名进行取地址运算
int a[] = {1,2,3}; int (*p)[3] = &a; //注意左值
对数组名取地址,得到的指针为指向整个数组的指针。
形参数组
形参为数组时勿须带数组长度,因为计算机不会处理,如果需要传数组长度,需要另外加参数。
一维数组指针
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 3 //void array_add(int a[], int len) 4 void array_add(int *p, int len) 5 { 6 int i = 0; 7 8 for(i=0; i<len; i++) 9 p[i]++; 10 } 11 int main(void) 12 { 13 int a[] = {1,2,3}; 14 int i = 0; 15 int *p1 = a; 16 int (*p2)[3] = &a; 17 int len = sizeof(a)/sizeof(int); 18 19 array_add(a,len); 20 for(i=0; i<len; i++) 21 printf("%d\t", a[i]); 22 printf("\n"); 23 24 printf("a[1] = %d\n", *(p1+1)); 25 printf("a[1] = %d\n", p1[1]); 26 printf("a[1] = %d\n", 1[p1]); 27 28 printf("a[1] = %d\n", (*p2)[1]); 29 printf("a[1] = %d\n", *(*p2 +1)); 30 31 return 0; 32 }
二维数组指针
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 3 //void array_add(int a[][], int len) 4 int array_add(int (*p)[3], int row, int lines) 5 { 6 int i,j; 7 int result = 0; 8 9 for(i=0; i<row; i++) 10 for(j=0; j<lines; j++) 11 result += p[i][j]; 12 13 return result; 14 } 15 int main(void) 16 { 17 //一个二维数组可以看做是两个一维数组,而a[0]和 a[1]分别是这两个一维数组的名字。 18 int a[2][3] = {1,2,3,4,5,6}; 19 int (*p[2])[3] = {a, a+1}; 20 int (*p1)[3] = a;//数组的名字代表指向数组首元素的首地址(这里二维数组的首元素是一个一维数组) 21 int (*p2)[2][3] = &a;//对数组名取地址之后,其指针指向整个数组,在这里p2指向整个二维数组,若p2+1,则跳过24个字节,即整个数组。 22 int *p3 = a[0]; 23 int (*p4)[3] = &a[0]; 24 int b = a[0][0]; 25 int *p5 = *a; //在这里a可以看做是指向行的地址,加*之后变成了指向列的地址。(这种描述方式只是便于理解) 26 int result = 0; 27 28 result = array_add(a, 2, 3); 29 printf("result = %d\n", result); 30 31 printf("a[1][1] = %d\n", *(*(a+1)+1)); 32 printf("a[1][1] = %d\n", *(*(p1+1)+1)); 33 printf("a[1][1] = %d\n", p1[1][1]); 34 printf("a[1][1] = %d\n", (*p2)[1][1]); 35 printf("a[1][1] = %d\n", *(p3+4)); 36 printf("a[1][1] = %d\n", *(*(p4+1)+1)); 37 38 return 0; 39 }