数组:
学习数组的时候老师强调,数组是在内存空间上连续分布的一群相同数据类型的元素的集合。图中,数组并没有初始化,但运行时仍然分配了内存
的确是这样,并且数组名 a (它的值是地址)和数组第0个元素 a[0] 地址是一样的。
指向数组的指针:
以上代码和运行结果就说明了,申明一个指针 pa 指向数组 a 后:
- pa + i 和 &a[i] 是等价的
- *(pa + i) 和 a[i] 是等价的
事实上,即使你让数组越界也不会有什么事情发现,地址输出仍然是正确的,只是值是不可预知的。如下代码所示:
指向数组的指针没什么特别的。如下,我们可以用指针变量 pa 作为条件判断依据:
数组名不是指针变量
数组名是数组首个元素的地址,但不是指针变量。它和指针变量是有区别的!如下:
1.pa 是个变量,可以 pa++ 而 a++ 是非法的。
2.sizeof(数组名)得到的是数组的大小,而sizeof(指针)得到的就是指针的大小啦!
总的来说,数组名更像是指针,而不是指针变量
混淆:指针和指针变量
老师说过,指针是指针变量的值。似乎还说过指针和地址是等价的。我们说指针变量是有类型的(那么指针也有类型?),虽然我不是很清楚指针和地址的更多区别,但为了避免混淆,我们还是尽量明确“指针变量”,感觉平时说的“指针”,很多时候是指“指针变量”…这里只是提一下。
PS:接下来这部分内容主要参考<The C Programming Language>(C程序设计语言-第2版)来写
这篇文章对应于 第83页 5.3 指针与数组
第5.4 地址算术运算,这部分我没看懂….先跳过了