类型 | 普通指针 | 指针数组(非指针类型) | 数组指针 | 结构体指针 | 函数指针 | 二重指针 |
定义方式 | int *p; | int *p[5]; |
int (*p)[5]; int a[3][5]; |
struct{...int i;..}a, *p |
int (*p)(int,int); int add(int a,int b) |
int **p1; int *p2; int *p3[5]; |
赋值方式 | p=&a; | —— | p=a; | p=&a | p=add; |
p1=&p2; p1=&p3; |
解引用 | *p=10; | —— |
p[1][2]=5; *(*(p+i)+j)=5; |
p->i=10; | p(10,20); | *p1=(int*)0xffff; |
- 指针数组与数组指针
指针数组 int *p[5]; p为数组,数组存储的为指针。
数组指针 int (*p)[5]; p为指针,指向一个一维数组。
- 以指针方式访问数组
一维数组 int *p; int a[5];
p=a;
*(p+i)相当于a[i]
二维数组 int a[2][5];
对应指针 int (*p)[5];//p为指针,指向数组长度为5 的一维指针
p=a;
*(*(p+i)+j)相当于a[i][j];
分析:内层的p为数组指针,所以解引用后 *(p+i)是p指向的值,为一个一维数组的首地址。再次解引用*(*(p+i)+j),才为这个数组内的值。