标题 关于指针和数组指针对数组元素的调用的理解
首先,要先清楚指针和数组指针的分别,
指针:计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。
数组指针:eg:int (*p)[n]就是一个数组指针(也称为行指针)
()优先级高,说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
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][]
所以数组指针也称指向一维数组的指针,亦称行指针。
明白了指针和数组指针的区别后,接下来是了解指针和数组指针对数组元素的调用。
#include"stdio.h"
int main()
{
int a[3][2]={1,2,3,4,5,6};
int *p; //定义一个指针变量
p=a; //将数组的首地址给指针p
printf("%d\n",*p);
}
输出结果:1
而如果直接使用数组指针:
#include"stdio.h"
int main()
{
int a[3][2]={1,2,3,4,5,6};
int (*p)[2]; //注意()的优先级大于[],如果直接int *p[1],则表是为一个指针数组
p=a;
printf("%d\n",*p);
}
输出结果:1703708 //为一个地址值
若想正确调用a数组中的数组元素,则需要用**p。
#include"stdio.h"
int main()
{
int a[3][2]={1,2,3,4,5,6};
int (*p)[2];
p=a;
printf("%d\n",**p);
}
输出结果:1
为什么会出现指针和数组指针对数组元素调用的方式不同呢?
答:*p是一个指针变量,p指向的其实是a[0]或a[0][0];
而( *p)[2]是一个数组指针,p指向的其实是a[0],a[1]或a[0][0],a[0][1]这样的形式;
也就是说 * p中的p指向的是a数组中a[0][0]的地址,而( * p)[2]中的p指向的是a数组中第一行a[0][0],a[0][1](可以将这两个数组元素看成是二维数组中的一个一维数组)的地址,所以( * ( * p))第一个 * 解析的是二维数组中一维数组的地址,而第二个 * 解析的是二维数组中一维数组的第一个数组元素的地址。
所以,虽然说 p=a;指针p和数组指针p指向的都是数组a的首地址,但是在理解上还是不一样的。