数组名是什么?数组名是数组首元素的地址
所以我们打印数组首元素地址与数组名地址,看一下是否一样验证一番(这里的%p是专门打印地址的哦( •̀ ω •́ )✧
结果是一样哒!说明数组名就是首元素地址^.^
那么下面我们继续用sizeof来验证一下,如果数组名表示的是首元素地址的话,这时的sizeof(arr)打印出的字节长度应该为4
啊啦!运行结果并不是4捏,变成40了,那这是不是证明上方数组名是首元素地址的结论错了呢?
其实这是数组名表示首元素地址的两种例外情况
- sizeof内部放一个数组名,这个时候的数组名表示的是整个数组,同样计算的是整个数组的大小,单位是字节
- 取地址&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
下面我们采用控制变量的方式,来看看取地址数组名、数组名与取地址数组第一个元素,分别打印它们的地址
咦惹?怎么会三个一样呢?
不会吧这,书上的结论清清楚楚明明白白白纸黑字不会错了8
答案当然是……没有错啦!
我们可以把这三行分成两部分来看,第二三行表示的雀食是数组名等价于数组首元素的地址,第一行的取地址数组名即&arr取出的是数组的地址
假设这是arr数组,那么红色框框就是这个数组的首元素,绿色箭头表示的即为首元素的元素地址;我们取数组地址肯定不会是从这十个元素的地址里面随便选一个当作数组的地址吧?(数组不是那么随便的银……)我们在取整个数组地址的时候肯定是从数组的首元素开始,因此数组的地址与数组首元素的地址相同是十分正常滴(●’◡’●)
那么它们为什么不一样呢?下面我们接着来验证,分别将数组地址+1及数组首元素地址+1
我们只看它们不一样的后两位:
上一对28变成了50,这两个数之间差了十六进制的28,即为0x28,16×2+8=40;下一对28变成2C的时候,差了4,结果的不同也证明了它们的意义并不一样
数组的地址+1和数组首元素地址+1是不一样的!数组内每个元素地址是挨着的分别相差4个字节,每个数组之间隔了一个数组的十个元素,即为40个字节
有帮助到你的话,点个赞再走嘛