数组指针
定义 int (*p)[n];
由优先级关系,圆括号 () 与方括号 [] 优先级相同,从左至右阅读,则圆括号 () 优先级更高,首先说明了 p 是一个指针。然后得出该指针指向一个一维数组。
数组长度为 n,则指针总步长为 n。倘若出现二维数组,则 p+1 (p++) 时,要跨过 n 个整型数据的长度。
如要将一维数组赋给一指针,应这样赋值:
int a[4];
int *p; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该一维数组的首地址赋给p,也就是a[0]
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
注意 ① 数组名是该数组第一个元素的地址,语句“p = a”,左为指针变量(值为地址),右为数组名(第一个元素的地址),故“地址 = 地址”,语句成立。
② 二维数组的指针相较于一维数组要打括号,是因为二维数组本身可看作若干个一维数组为元素的一维数组。指针指向的地址类型要和二维数组内含的元素地址类型相同(即二维数组元素为长度是4的一维数组时,一个指针指向4个内存空间的地址,所以该指针要声明时包含内存空间长度【即步长】)((((其实我也不是特别懂,希望有人能指正))))
指针数组
定义 int *p[n];
由优先级关系,方括号 [] 优先级在一级,先与 p 结合成为一个数组,再由 int* 说明这是一个整型指针数组,它有 n 个指针类型的数组元素。
如此定义的情况下,当执行 p+1 (p++) 时,只向前移动 1 个步长,指向下一个数组元素。
注意 不可使用 p = a 的赋值方式,p[n] 作为指针数组是一个含有 n 个指针的数组,本质上为指针,应该指向一个变量的地址。这样的赋值方式出现了“地址 = 值”的错误。
正确写法 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组,应这样赋值:
int *p[3];
int a[3][4];
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。