数组指针(也称行指针)
int (*p)[n];
()优先及高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
int a[3][2]
int (*p)[2]
p = a;
p++; 该语句执行后,也就是p=p+1,p跨过a[0][]指向了a[1][]
所以数组指针也称指向一维数组的指针,亦称行指针。
查看下例demo:
#include<stdio.h> int main(){ int a[3][2] = {{1,2},{3,4},{5,6}}; int (*p)[2] = a; int row = sizeof(a)/sizeof(a[0]); int col = sizeof(a[0])/sizeof(a[0][0]); printf("row = %d ,col = %d\n",row,col); int i = 0, j = 0; for(i = 0;i< row;i++){ for(j = 0; j < col;j++){ printf("%d ",a[i][j]); } printf("\n"); } int *p1 = p[0]; printf("%d,%d",*p1,*p1+1); p1 = p[1]; printf("%d,%d",*p1,*p1+1); return 0; }
指针数组
定义int *p[n]
[]优先级高,先与p结合成为一个数组,再由int *说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,
这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。
#include<stdio.h> int main(){ int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int *p[3]; int row = sizeof(a)/sizeof(a[0]); int col = sizeof(a[0])/sizeof(a[0][0]); int i = 0, j = 0; for(i = 0; i < row;i++){ p[i] = a[i]; for(j = 0;j < col;j++){ printf("%d ",*p[i]+j); } printf("\n"); } return 0; }