四个Hello world,就能让你深刻认识数组和指针!实乃管中窥豹

       各位,数组和指针的问题在C中可谓老生常谈了,是重点也是难点,今天我们通过一道题目管中窥豹,再次让大家理解一下它们之间复杂且微妙的关系,话不多说,请看题:

       题目很简单,就问最后会输出什么。下面我们对代码进行简单的分析:分别声明两个数组和指针,并都初始化为相同的内容"Hello world",然后分别对数组和指针进行比较,利用printf输出比较的结果,也就是真假,反映为%d就是0和1,本质上就是问我们两数组和两指针是否相等。

       讲到这里,其实这道题的考察点已经很清晰了。第一就是数组和指针的本质,也就是你对数组和指针的了解程度,在这里你得知道“arr1==arr2和p1==p2”他们比较的究竟是什么?

       对于数组来说,数组名它可以退化为一个地址,这个地址是数组首元素的地址,也就是数组的起始地址,这里要特别强调一点:整个数组的地址和数组首元素的地址二者值一样,但代表的意义完全不同,对应的表示方法为&arr1和arr,这一点前面讲过几次,今天不是我们讨论的重点,还有一些具体应用的东西我们就不展开了。回到本题,arr1==arr2那就是比较两个地址是否一样,说白了就是两个Hello world是不是放在一个位置。

       对于指针来说,我们讲指针有己址、己值、它址、它值等特点,己址就是指针变量本身的地址,己值就是指针变量本身地址所存放的值,也就是我们通常说的指向的地址,这也正是它址,所以己值和它址意义是一样的,而它值就是指针指向地址位置所存放的值。这些如果你理解了的话,那本题其实就是比较己值(它址)是否一样,也就是存放Hello world的地址是否一样。

       到这里本题就变为了存放四个Hello world的地址是否一样。这也正是考察的第二点:C语言的内存布局。关于这个前面讲过好多次了,我们就不细讲了,两个数组声明并初始化后,分配了不同的内存位置,即使存储的都是相同的字符串常量。而两个指针并未分配具体存储位置,初始化后二者都指向同一字符串常量,说白了就是我们上面讲的,两个指针己址不同,己值相同,它值相同,那比较的结果也就自然相同了。那本题答案很清晰了,arr1不等于arr2,p1等于p2,相应输出0和1。

       就到这里吧,应该来讲题目都是环环相扣,这道题你得对数组和指针有一定的了解才能看出深层次考察的是内存布局,这里也希望通过本题让大家对数组和指针有更深的理解,感谢大家耐心阅读!

       对于热爱编程的人来说,有一群一起学习一起解答的小伙伴很重要,笔者有一个编程零基础入门学习交流俱乐部还有学习视频文件!欢迎初学者和正在进阶中的小伙伴们!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章