数组名是数组第一个元素的地址

大前天,笔者在给同学解答问题时,遇到了这个问题。

 

程序1:

程序2:

出现这个疑问,很正常,因为初学者会很自然的将代码记忆化——比如这段代码是干嘛的,那么我遇到这个功能就用这段代码,但具体代码是什么意思,往往不管,有点类似于记单词的意思。但程序不同,代码都很灵活,相同的功能可以用不同的代码实现。所以这就要求我们理解代码的具体意义,灵活应用。下面我就来解答下这个问题:

对程序1的理解

其中,程序1中第5行

p= &a;

由于第3行已经定义了一个指针变量p

int* p= NULL;

补充:为什么要指向NULL?

所以第5行的代码意义是:将变量a的地址存放在指针变量p中。

p = &a;    //第3行和第5行加起来等价于int* p = &a;

对程序2的理解

程序2与程序1相比,有个明显的区别就是程序2是一个一维数组。数组的名字叫做“a”。

int* p = a;    //看起来少了一个&,但是因为“数组名就是数组第一个元素的首地址”,所以这个a相当于&a[0]

验证

先定义一个一维数组a,然后把数组名a的地址打印出来:

#include <stdio.h>

int main(void) {
    int a[5] = {1, 2, 3, 4, 5};
    printf("%p\n", a);
    return 0;
}

然后把a[0]的地址打印出来:

#include <stdio.h>

int main(void) {
    int a[5] = {1, 2, 3, 4, 5};
    printf("%p\n", &a[0]);    //记得加&
    return 0;
}

 

总结

数组名等价于数组第一个元素的地址,即数组名 a 等价于 &a[0]。

作者: 高志远

高志远,24岁,男生

《数组名是数组第一个元素的地址》有2条评论

匿名进行回复 取消回复

邮箱地址不会被公开。