首页 理论教育C语言数组元素的指针引用

C语言数组元素的指针引用

【摘要】:对一维数组的引用,既可以用传统的数组元素的下标法,也可使用指针的表示方法。例7.11输入10个数,采用指针变量表示的地址法输入输出数组各元素。由于数组元素在内存是连续存放的,若给指向整型变量的指针传递数组的首地址,则该指针指向二维数组。#include<stdio.h>例7.16用指针法输入输出二维数组各元素。

1.指针与一维数组

假设定义一个一维数组,该数组在内存会有系统分配的一个存储空间,其数组的名字就是数组在内存的首地址。若再定义一个指针变量,并将数组的首址传给指针变量,则该指针就指向了这个一维数组。数组名是数组的首地址,也就是数组的指针。而定义的指针变量就是指向该数组的指针变量。对一维数组的引用,既可以用传统的数组元素的下标法,也可使用指针的表示方法。例如:

int a[10],*ptr; /*定义数组与指针变量*/

ptr=a;(或ptr=& a[0];)

则ptr就得到了数组的首址。其中,a是数组的首地址,& a[0]是数组元素a[0]的地址。由于a[0]的地址就是数组的首地址,所以两种赋值操作效果完全相同。指针变量ptr就是指向数组a的指针变量。

下面介绍C语言规定的指针对数组的表示方法:

(1)ptr+n与a+n表示数组元素a[n]的地址,即 & a[n]。对整个a数组来说,共有10个元素,n的取值为0~9,则数组元素的地址就可以表示为(ptr+0)~(ptr+9)或(a+0)~(a+9),与 & a[0]~ & a[9]保持一致。

(2)根据数组元素的地址表示方法,*(ptr+n)和*(a+n)就表示为数组的各元素(即等效于a[n])。

(3)指向数组的指针变量也可用数组的下标形式表示为ptr[n],其效果相当于*(ptr+n)。

例7.10 输入10个数,以数组的不同引用形式输出数组各元素的值。

例7.11 输入10个数,采用指针变量表示的地址法输入输出数组各元素。

例7.12 输入10个数,采用数组名表示的地址法输入输出数组各元素。

例7.13 输入10个数,用指针表示的下标法输入输出数组各元素。

例7.14 输入10个数,利用指针法输入输出数组各元素。

2.指针与二维数组(www.chuimin.cn)

定义一个二维数组:

int a[3][4];

其中a是二维数组的首地址,& a[0][0]既可以看作数组a第0行0列的首地址,也可以看作是二维数组的首地址。a[0]是第0行的首地址,当然也是数组的首地址。同理a[n]就是第n行的首址,& a[n][m]就是数组元素a[n][m]的地址。既然二维数组每行的首地址都可以用a[n]来表示,就可以把二维数组看成是由n行一维数组构成,将每行的首地址传递给指针变量,行中的其余元素均可以由指针来表示。

若定义的二维数组其元素类型为整型,每个元素在内存占2个字节,假定二维数组从1000存储单元开始存放,则以按行存放的原则,数组元素在内存的存放地址为1000~1023。

若用地址法来表示数组各元素的地址,对元素a[1][2]而言,& a[1][2]是其地址,a[1]+2也是其地址。分析a[1]+1与a[1]+2的地址关系,它们地址的差并非整数1,而是一个数组元素的所占位置2,原因是每个数组元素占2个字节。

对0行首地址与1行首地址a与a+1来说,地址的差同样也并非整数1,是一行,即4个元素占的字节数8。

由于数组元素在内存是连续存放的,若给指向整型变量的指针传递数组的首地址,则该指针指向二维数组。

int*ptr,a[3][4];

ptr=a;

则用ptr++就能访问数组的各元素。

例7.15 用地址法输入输出二维数组各元素。

#include<stdio.h>

例7.16 用指针法输入输出二维数组各元素。