首先确定优先级:()>[]>*,另外数组指针,类比整型指针,表示指向数组的指针;指针数组,类比整型数组,表示元素为指针的数组。
数组指针
int (*p)[n] 首先()优先级高,它是一个指针,指向一个整型数组。n为数组的长度,当p+1时需要跨越n个整型数据的长度,通常用来表示二维数组及二维数组的函数传参。
一维数组赋值给数组指针时,需要取数组地址或对其进行强制转换,另外相当于二维数组中只有一个行元素,p3+1的地址没有意义,*(p3+1)也无法显示。
1 char a[5] = { 'A', 'B', 'C', 'D' }; 2 char(*p3)[5] = &a; 3 char(*p4)[5] = (char (*)[5])a;
二维数组赋值给数组指针时,具体间接访问格式,可以参考上一篇博文指针和数组的关系。
1 # include <stdio.h> 2 int main(void) 3 { 4 int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; 5 int i, j; 6 int (*p)[4] = a; //记住这种定义格式 7 for (i=0; i<3; ++i) 8 { 9 for (j=0; j<4; ++j) 10 { 11 printf("%-2d\x20", *(*(p+i)+j)); /*%-2d中, '-'表示左对齐, 如果不写'-'则默认表示右对齐;2表示这个元素输出时占两个空格的空间*/ 12 } 13 printf("\n"); 14 } 15 return 0; 16 }
二维数组元素地址赋值给一维指针,对元素进行访问时需要跨越n个整型数据的长度,即p + i*N +j == &a[i][j]
1 # include <stdio.h> 2 int main(void) 3 { 4 int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; 5 int i, j; 6 int *p = &a[0][0]; //把a[0][0]的地址赋给指针变量p 7 for (i=0; i<3; ++i) 8 { 9 for (j=0; j<4; ++j) 10 { 11 printf("%-2d\x20", *(p+i*4+j)); 12 } 13 printf("\n"); 14 } 15 return 0; 16 }
指针数组
int *p[n] 首先[]优先级高,它是一个数组,前面为int*,表示数组的元素为整型指针,也可表示为int **p,其中C中处理字符串用该数据类型较多,涉及到二级指针时也容易出问题。
这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。
一级指针和二级指针