【C/C++】深入理解指针和数组的关系

对数组名进行取地址运算

int a[] = {1,2,3};
int (*p)[3] = &a;    //注意左值

 

对数组名取地址,得到的指针为指向整个数组的指针。

 

形参数组

形参为数组时勿须带数组长度,因为计算机不会处理,如果需要传数组长度,需要另外加参数。

 

一维数组指针

 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 }
View Code

 

 

二维数组指针

 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 }
View Code

 

posted @ 2013-07-13 17:26  Leo.cheng  阅读(849)  评论(0编辑  收藏  举报