〃忝書γě渎ぐ 发表于 2019-12-18 17:37:05

C语言指针与数组关系

#include <stdio.h>

int main()
{
    int a = {0};
    printf("%x %x %x \n",&a,a,a); //为什么&a和a是同一个地址?
    return 0;
}

行客 发表于 2019-12-18 17:37:06

本帖最后由 行客 于 2019-12-19 21:16 编辑

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

为了便于说明,我们把
int a = {0};
重新定义为
int a = {{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,a,a,a,a。每个行元素都可以看成含有 4 个元素的一维数组。而且 C 语言规定,a、a、a、a、a分别是这五个一维数组的数组名。
也就是可以看成
a={1,2,3,4}
a={5,6,7,8}
.
.
.
a={17,18,19,20}

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



**** Hidden Message *****

陈浩楠 发表于 2019-12-18 18:03:39

数组名是指向数组值的指针

〃忝書γě渎ぐ 发表于 2019-12-18 18:28:48

陈浩楠 发表于 2019-12-18 18:03
数组名是指向数组值的指针

主要不明白,为什么 &a和a 一样的?
页: [1]
查看完整版本: C语言指针与数组关系