首页 理论教育 指针与二维数组详解-C语言程序设计

指针与二维数组详解-C语言程序设计

时间:2023-10-20 理论教育 版权反馈
【摘要】:图9.4二维数组的存储从图9.4 来看,数组名num 代表整个二维数组的首地址,也就是第0 行的首地址。num[1]是第二个一维数组的数组名和首地址,因此也是2016。"长度"表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。例如:表示num 是一个指针变量,指向有5 个元素的一维数组,数组元素为整型。例如:一个3*4 的二维数组中存放1~12 共12 个数,输入行数和列数显示对应的数组元素的值。

指针与二维数组详解-C语言程序设计

1.二维数组地址

假设有一个二维数组num,它有3 行4 列,其定义为:

num是一个数组名。num数组包含3行,即3个元素:num[0],num[1],num[2]。而每一元素又是一个一维数组,它包含4个元素,如num[0]又包含4个元素:num[0][0]、num[0][1]、num[0][2]、num[0][3]。如图9.4所示。

图9.4 二维数组的存储

从图9.4 来看,数组名num 代表整个二维数组的首地址,也就是第0 行的首地址。num+1代表第1 行的首地址。如果二维数组的首地址为2000,则num+1 为2016,因为第0 行有4个整型数据,每个整型数据占4 个字节,因此num+1 的含义是num[1]的地址,即num+4×4=2016。num+2 代表第2 行的地址,它的值是2032。

由于num代表第0行的首地址,则num[0]是第一个一维数组的数组名和首地址,因此也为2000。*(num+0)或*num是与num[0]等效的,它表示一维数组num[0]的0号元素的首地址,也为2000。&num[0][0]是二维数组num的0行0列元素首地址,同样是2000。因此,num,num[0],*(num+0),*num,&num[0][0]是相等的。同理,num+1 是二维数组第1 行的首地址,等于2016。num[1]是第二个一维数组的数组名和首地址,因此也是2016。&num[1][0]是二维数组num的1行0列元素地址,也是2016。因此num+1,num[1],*(num+1),&num[1][0]是等同的。由此可得出:num+i,num[i],*(num+i),&num[i][0]是等同的。

此外,&num[i]和num[i]也是等同的。因为在二维数组中不能把&num[i]理解为元素num[i]的地址,不存在元素num[i]。

C语言规定,它是一种地址计算方法,表示数组num 第i 行首地址。由此,我们得出:num[i],&num[i],*(num+i)和num+i也都是等同的。另外,num[0]也可以看成是num[0]+0是一维数组num[0]的0 号元素的首地址,而num[0]+1 则是num[0]的1 号元素首地址,由此可得出num[i]+j则是一维数组num[i]的j元素首地址,它等于&num[i][j]。由num[i]=*(num+i)得num[i]+j=*(num+i)+j,由于*(num+i)+j是二维数组num的i行j列元素的首地址。由此可得

2.指向一维数组的指针

指向一维数组的指针变量定义的一般格式:

类型说明符 (*指针变量名)[长度];

说明:类型说明符为所指数组的数据类型。"*"表示其后的变量是指针类型。"长度"表示二维数组分解为多个一维数组时,一维数组的长度,也就是二维数组的列数。(www.xing528.com)

注意:"(*指针变量名)"两边的括号不可少,如缺少括号则表示是指针数组,意义就完全不同了。例如:

表示num 是一个指针变量,指向有5 个元素的一维数组,数组元素为整型。也就是num 所指的对象是有5 个整型元素的数组,此时num 只能指向一个包含5 个元素的一维数组,num 的值就是该一维数组的起始地址。

例如:

【例9.7】一个3*4 的二维数组中存放1~12 共12 个数,输入行数和列数显示对应的数组元素的值。

程序代码:

运行结果:

程序讲解:

本例程序中,定义了3行4列二维整型数组num,定义了指向一维数组的指针变量p,把数组名num 赋给指针变量p。根据键盘输入行下标和列下标,用指针变量p 引用该数组元素并输出该元素的值。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈