为何C语言中数组名num的&num与num输出地址相同?
为什么
&num和num输出的地址相同? 这是C语言里数组和指针最容易混淆的经典问题之一,我来给你拆解清楚:
首先明确几个核心概念:
- 你定义的
num是一个长度为11的char数组,它在内存中是连续存放的11个char单元,第一个单元就是字符'M'。 - 当你在表达式中直接使用
num时(除了sizeof(num)、&num这两种特殊场景),它会自动转换成指向数组首元素的指针,等价于&num[0]。所以printf("%p\n", num)打印的其实是数组第一个元素'M'的内存地址。 - 而
&num是取整个数组的地址,它的类型是char (*)[11](可以理解为“指向长度为11的char数组的指针”)。
那为什么地址值完全一致?
因为数组在内存中的起始位置,和它第一个元素的起始位置是完全重合的。整个数组从某块内存地址开始存放,第一个元素自然也从这个地址开始,所以&num(数组的地址)和num转换后的&num[0](首元素的地址),它们的数值完全相同,打印出来的结果当然就一样了。
不过要注意,这两个指针的类型是完全不同的,只是地址值相同而已。比如你可以试试对它们做加法操作:
num + 1:会移动1个char的大小(因为num转换后是char*类型),指向数组的第二个元素'i'。&num + 1:会移动整个数组的大小(11个char),指向数组末尾之后的位置。
再回到你的代码,*num其实就是对num转换后的指针解引用,也就是取首元素num[0]的值,所以打印出'M'就完全合理了。
内容的提问来源于stack exchange,提问作者Bobstanley
相关产品推荐
相关产品推荐

