数组
我们都知道访问数组的一个元素可以通过下标访问。
例如
1 | int a[5] = { 1,2,3,4,5 }; //初始化 |
通过下标我们访问了数组a
的第0
个和第1
个元素。
但是数组的下标访问本质是编程语言的一个语法糖。
数组的本质是开辟一串连续的空间用于存储数据。
指针
数组名其实是指向数组头的一个指针。
例如:
1 | int a[5] = { 1,2,3,4,5 }; |
将a+1
地址0000009A7DD8FD0C与a
地址0000009A7DD8FD08相减,可以得到结果为4。
根据int类型的占用空间
int类型在内存中占用了4个字节
我们可以知道a
对应的是a[0]
的地址,a+1
对应的就是a[1]
的地址。
使用*
取值符(解引用操作符),可以访问这个地址的数据。
例如:
1 | int a[5] = { 1,2,3,4,5 }; |
跟使用a[0]
和a[1]
访问效果一样。
通过这个例子可以看出,a[n]
的本质其实就是*(a+n)
。
这也解答了为什么数组是从0开始而不是从1开始。
因为数字对应了指针的偏移量。
第一个元素是头元素,偏移量为0,所以从数组是从0开始的。
最后的话
在C语言里指针是一个很重要的概念。
初学时总觉得很复杂,很麻烦,是一个难点。
学习指针时还是要多结合实际对指针的利用来学,这样才能尽快搞懂。
指针应是跟变量绑定在一起开始学的,任何一个变量都包括地址和数据。
正常赋值是对数据操作的,而指针是对地址操作的。
不知道为什么许多教程可能认为这是个难点,所以就都独立出来讲。
导致学的时候迷迷糊糊一下子就过去,也不知道什么时候派上用场。