5.3.1 指针与一维数组
对数组元素的访问,可以利用数组元素的序号进行(下标法),也可以利用一个指向数组的指针进行(指针法)。
在C语言中,指针和数组之间存在密切的联系。一个数组名实际上代表了数组的第一个元素的起始地址(首地址)。数组名就是数组首地址的符号地址。例如:
int data[10];
数组data占用10个整型数据所需要的连续的存储空间,依次存放data[0]~data[9]共10个数组元素,数组名data代表了存储空间的首地址。即
data 与 &data[0]等效
data+i 与 &data[i]等效
在程序执行过程中,数组data所分配的存储空间不会改变。程序中,data作为常量地址,不允许修改。
若定义一个指针变量p及数组data:
int *p,data[10];
执行操作:
p=data; 或 p=&data[0];
则将指针p指向数组data的第一个元素,如图5.3.1所示。由于表达式p+i表示的地址值与&data[i]表示的地址值相同,因此可以通过表达式中i值的变化(i=0,1,2,…,9)来实现对数组data中各元素的访问。
注意:当指针变量指向一维数组的第一个元素,指针变量名可以作为一维数组名使用。data[i]与p[i]是等效的。
*p=100; 等效于 data[0]=100;
*(p+1)=200; 等效于 data[1]=200;
*(p+i)=500; 等效于 data[i]=500;
图5.3.1 指针与数组元素之间的关系
若指针p当前指向数组的起始地址,执行语句:
p=p+4
则将指针从指向数组的第一个元素改变为指向数组的第五个元素data[4],此时:
*p 表示 data[4]
*(p+1) 表示 data[5]
*(p−1) 表示 data[3]
因此,对数组元素的访问可用下标方式,也可以用指针方式,通常下标方式适于随机访问数组。在C语言中,用指针自增、自减的操作可实现对数组的快速顺序访问,提高程序的运行效率。
应该注意:虽然数组名data和指针p都代表地址值,但data是一个常量地址,不能改变,而指针p是一个指针变量,它可以指向任一个数组元素。下面的语句合法:
p=data;
p++;
p=p+3;
但以下语句非法:
data=p;
data++;
data=data+3;
例5-5 指针与数组的关系。
参考程序为
程序运行结果:
表达式*(p+i)和data[i]是等价的,是用指针法和下标法来表示访问数组元素的两种不同形式。
例5-6 使用指针计算fibonacci数列的前15个数。
参考程序为
输出结果:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
指针可访问一维数组,也可访问多维数组。指向多维数组的指针的概念和使用方法比指向一维数组的指针要复杂一些。
以二维数组为例,二维数组可以当作若干个按行主序存放的一维数组。例如,有定义:
int a[5][4],*pa;
二维数组a,共包括20个整型数据;二维数组a由a[0]~a[4]共 5个数组元素构成;而每个数组元素又是一个由4个数组元素构成的一维数组(如图5.3.2所示)。
图5.3.2 二维数组的构成
根据二维数组由一维数组构成的组织结构及二维数组按行主序顺序连续存放的存储结构,可以将指向一维数组的指针推广到指向二维数组的指针。
pa=a[0];
表示将一维数组a[0]的起始地址赋予指针pa,即pa指向一维数组a[0]的第一个元素a[0][0]。
与该赋值语句等效的语句有:
pa=a; 或 pa=&a[0][0];
而语句:
pa++;
表示pa自增1,即将指针pa指向元素a[0][1]。
同理,若执行
pa=a[4];
表示将一维数组a[4]的地址赋予指针pa,也即将指针指向数组元素a[4][0]。*pa代表数组元素a[4][0]。
例5-7 用指针变量输出数组元素的值。
参考程序为
程序运行结果
1 3 5 7
9 11 13 15
17 19 21 23
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。