数组指针/指针数组和二级指针

首先确定优先级:()>[]>*,另外数组指针,类比整型指针,表示指向数组的指针;指针数组,类比整型数组,表示元素为指针的数组。

数组指针

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],而且它们分别是指针变量可以用来存放变量地址。

一级指针和二级指针

猜你喜欢

转载自www.cnblogs.com/qinguoyi/p/10116416.html