指针数组和数组指针的区别
指针数组: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 }
结果: