指针数组和数组指针的区别

参考:指针数组和数组指针的区别 关于C语言行指针的详细解析

 

指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针

数组指针:a pointer to an array,即指向数组的指针

还要注意的是他们用法的区别,下面举例说明。

int* a[4]     指针数组     

                 表示:数组a中的元素都为int型指针    

                 int型元素表示:*a[i] (a[i]表示int型元素的地址)  *(a[i])是一样的,因为[]优先级高于*

int (*a)[4]   数组指针                          ----------另一中理解方式:int (*)[4] a;

                 表示:指向int型数组a的指针

                 int型元素表示:(*a)[i]  

注意:在实际应用中,对于指针数组,我们经常这样使用:

1 #include "stdafx.h"
2 
3 typedef int* pInt;
4 pInt a[4];
5 
6 int _tmain(int argc, _TCHAR* argv[])
7 {
8     return 0;
9 }

这跟上面指针数组定义所表达的意思是一样的,只不过采取了类型变换。

 

数组指针代码如下:

 1 #include "stdafx.h"
 2 
 3 
 4 int _tmain(int argc, _TCHAR* argv[])
 5 {
 6     int array[3] = {1,2,3};
 7 
 8     //指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针
 9     typedef int* pInt;
10     pInt pIntArray[3] = {&array[0], &array[1], &array[2]}; 
11 
12     for(int i = 0; i < 3; ++i)
13         printf("%d\n", array[i]);
14 
15     printf("\n");
16 
17     for(int i = 0; i < 3; ++i)
18         printf("%p %d\n", pIntArray[i], *pIntArray[i]);
19 
20     printf("数组指针\n");
21 
22     //数组指针:a pointer to an array,即指向数组的指针
23     int (*arrayPointer)[3];
24 
25     arrayPointer = &array; //arrayPointer = array; 
26                            //error C2440: '=' : cannot convert from 'int [3]' to 'int (*)[3]'
27                            //arrayPointer类型是int (*)[3],array类型是int [3]
28 
29     for(int i = 0;i < 3;++i)
30         printf("%d\n", (*arrayPointer)[i]); //arrayPointer = &array; *arrayPointer即逆向引用等同于array
31 
32     printf("通过二维数组理解数组指针\n");
33 
34     //通过二维数组理解数组指针
35     int array2D[2][3] = {{11,12,13},
36                          {24,25,26} }; //定义的array2D[2][3]的二维数组,可以把它当2个一维数组来看待。即:
37                                        //array2D[0]={11,12,13}
38                                        //array2D[1]={24,25,26}
39     for(int i = 0;i < 2;++i)
40     {
41         for(int j = 0;j < 3;++j)
42             printf("%d ", array2D[i][j]);
43         printf("\n");
44     }
45 
46     printf("行指针即为数组指针\n");
47 
48     //行指针即为数组指针(行指针:指向一行的指针,即二维数组中的某一行)
49     int (*rowPointer)[3];
50     rowPointer = &array2D[0]; //rowPointer = array2D[0];(rowPointer = array2D √:array2D即为&array2D[0])
51                               //error C2440: '=' : cannot convert from 'int [3]' to 'int (*)[3]'
52                               //rowPointer类型是int (*)[3],array2D[0]类型是int [3]
53 
54     printf("%p %p\n", &array2D[0], &array2D[0][0]); //array2D[0]和array2D[0][0]地址相同却意义不同:
55                                                     //array2D[0]类型是int [3], array2D[0][0]类型是 int
56                                                     //计算机中的字节就是一堆010101.....
57                                                     //用什么类型的变量解释这堆数据,
58                                                     //得到的就是对应类型的数据(类型强转基于此)
59     printf("通过行指针取出元素方式一\n");
60 
61     for(int i = 0;i < 2;++i)
62     {
63         for(int j = 0;j < 3;++j)
64             printf("%d ", (*(rowPointer + 1))[j]);
65         printf("\n");
66     }
67 
68     printf("通过行指针取出元素方式二\n");
69 
70     for(int i = 0;i < 2;++i)
71     {
72         for(int j = 0;j < 3;++j)
73             printf("%d ", (*(rowPointer))[j]);
74         rowPointer++; //行指针移动到下一行,移动n个地址位,n为一行的元素个数x元素的字节大小
75         printf("\n");
76     }
77 
78     getchar();
79     return 0;
80 }

 

结果:

 

 

数组与指针的艺术--深入探索c/c++数组与指针的奥秘 

posted @ 2014-11-15 14:38  kira2will  阅读(573)  评论(0编辑  收藏  举报