大前天,笔者在给同学解答问题时,遇到了这个问题。
程序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]。
不知道给人家打码,差评
感谢反馈,已经打码。