鱼C论坛

 找回密码
 立即注册
查看: 1193|回复: 3

[已解决]C语言指针与数组关系

[复制链接]
发表于 2019-12-18 17:37:05 | 显示全部楼层 |阅读模式
10鱼币
#include <stdio.h>

int main()
{
    int a[5][4] = {0};
    printf("%x %x %x \n",&a[0],a[0],a); //为什么&a[0]和a[0]是同一个地址?
    return 0;
}
最佳答案
2019-12-18 17:37:06
本帖最后由 行客 于 2019-12-19 21:16 编辑

地址为什么一样,很好说明。指向的是同一地址自然地址是一样的了,如果从汇编角度去看,将会更有利于理解。这里我们不进行汇编展开,只从C语言角度进行解释。

为了便于说明,我们把
int a[5][4] = {0};
重新定义为
int a[5][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16},{17,18,19,20}};

下面我们正式来进行说明:
要理解指针和二维数组的关系我们首先要记住一句话:二维数组就是一维数组。这句话该怎么理解呢?
如上我们定义的二维数组中,a 是二维数组名。a 数组包含5 行,即 5 个行元素:a[0],a[1],a[2],a[3],a[4]。每个行元素都可以看成含有 4 个元素的一维数组。而且 C 语言规定,a[0]、a[1]、a[2]、a[3]、a[4]分别是这五个一维数组的数组名。
也就是可以看成
a[0]={1,2,3,4}
a[1]={5,6,7,8}
.
.
.
a[4]={17,18,19,20}

既然,a[0]、a[1]、a[2]、a[3]、a[4]是一维数组名,一维数组的数组名表示的就是数组第一个元素的地址,所以 a[0] 表示的就是元素 a[0][0] 的地址,即 a[0]==&a[0][0];a[1] 表示的就是元素 a[1][0] 的地址,即 a[1]==&a[1][0];a[2] 表示的就是元素 a[2][0] 的地址,即 a[2]==&a[2][0]。余此类推。
所以二维数组a[M][N]中,a表示的就是元素a[0]的地址,即
a == &a[0] 。
所以a[0]也相当于指向a[0][0]这个元素的常量指针。此时如果打印
printf("%x %x %x \n", &a[0], a[0]+1, a); //注意a[0]+1
a[0]+1的地址将会向后移动4个字节,即元素a[0][0]的int类型宽度4。
而&a[0]就相当于指向a[0]这个一维数组的常量指针。此时如果打印
printf("%x %x %x \n", &a[0]+1, a[0], a); //注意a[0]+1
&a[0]+1的地址将会向后移动4*4即16个字节,即元素a[0]的int[4]类型宽度4*4,也就是16。

1.png

游客,如果您要查看本帖隐藏内容请回复

最佳答案

查看完整内容

地址为什么一样,很好说明。指向的是同一地址自然地址是一样的了,如果从汇编角度去看,将会更有利于理解。这里我们不进行汇编展开,只从C语言角度进行解释。 为了便于说明,我们把 int a[5][4] = {0}; 重新定义为 int a[5][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16},{17,18,19,20}}; 下面我们正式来进行说明: 要理解指针和二维数组的关系我们首先要记住一句话:二维数组就是一维数组。这句话该怎么理解呢 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-18 17:37:06 | 显示全部楼层    本楼为最佳答案   
本帖最后由 行客 于 2019-12-19 21:16 编辑

地址为什么一样,很好说明。指向的是同一地址自然地址是一样的了,如果从汇编角度去看,将会更有利于理解。这里我们不进行汇编展开,只从C语言角度进行解释。

为了便于说明,我们把
int a[5][4] = {0};
重新定义为
int a[5][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16},{17,18,19,20}};

下面我们正式来进行说明:
要理解指针和二维数组的关系我们首先要记住一句话:二维数组就是一维数组。这句话该怎么理解呢?
如上我们定义的二维数组中,a 是二维数组名。a 数组包含5 行,即 5 个行元素:a[0],a[1],a[2],a[3],a[4]。每个行元素都可以看成含有 4 个元素的一维数组。而且 C 语言规定,a[0]、a[1]、a[2]、a[3]、a[4]分别是这五个一维数组的数组名。
也就是可以看成
a[0]={1,2,3,4}
a[1]={5,6,7,8}
.
.
.
a[4]={17,18,19,20}

既然,a[0]、a[1]、a[2]、a[3]、a[4]是一维数组名,一维数组的数组名表示的就是数组第一个元素的地址,所以 a[0] 表示的就是元素 a[0][0] 的地址,即 a[0]==&a[0][0];a[1] 表示的就是元素 a[1][0] 的地址,即 a[1]==&a[1][0];a[2] 表示的就是元素 a[2][0] 的地址,即 a[2]==&a[2][0]。余此类推。
所以二维数组a[M][N]中,a表示的就是元素a[0]的地址,即
a == &a[0] 。
所以a[0]也相当于指向a[0][0]这个元素的常量指针。此时如果打印
printf("%x %x %x \n", &a[0], a[0]+1, a); //注意a[0]+1
a[0]+1的地址将会向后移动4个字节,即元素a[0][0]的int类型宽度4。
而&a[0]就相当于指向a[0]这个一维数组的常量指针。此时如果打印
printf("%x %x %x \n", &a[0]+1, a[0], a); //注意a[0]+1
&a[0]+1的地址将会向后移动4*4即16个字节,即元素a[0]的int[4]类型宽度4*4,也就是16。

1.png

游客,如果您要查看本帖隐藏内容请回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-18 18:03:39 | 显示全部楼层
数组名是指向数组值的指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-12-18 18:28:48 | 显示全部楼层
陈浩楠 发表于 2019-12-18 18:03
数组名是指向数组值的指针

主要不明白,为什么 &a[0]和a[0] 一样的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 03:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表