抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

数组


我们都知道访问数组的一个元素可以通过下标访问。

例如

1
2
3
4
5
6
int a[5] = { 1,2,3,4,5 }; //初始化
printf("%d %d", a[0], a[1]);

-----
output:
1 2

通过下标我们访问了数组a的第0个和第1个元素。

但是数组的下标访问本质是编程语言的一个语法糖。

数组的本质是开辟一串连续的空间用于存储数据。

指针


数组名其实是指向数组头的一个指针。

例如:

1
2
3
4
5
6
int a[5] = { 1,2,3,4,5 };
printf("a的地址为%p,a+1地址为%p", a, a + 1); //%p输出

-----
output:
a的地址为0000009A7DD8FD08,a+1地址为0000009A7DD8FD0C

a+1地址0000009A7DD8FD0C与a地址0000009A7DD8FD08相减,可以得到结果为4。

根据int类型的占用空间

int类型在内存中占用了4个字节

我们可以知道a对应的是a[0]的地址,a+1对应的就是a[1]的地址。

使用*取值符(解引用操作符),可以访问这个地址的数据。

例如:

1
2
3
4
5
6
int a[5] = { 1,2,3,4,5 };
printf("%d %d", *a, *(a+1));

-----
output:
1 2

跟使用a[0]a[1]访问效果一样。

通过这个例子可以看出,a[n]的本质其实就是*(a+n)

这也解答了为什么数组是从0开始而不是从1开始。

因为数字对应了指针的偏移量。

第一个元素是头元素,偏移量为0,所以从数组是从0开始的。

最后的话


在C语言里指针是一个很重要的概念。

初学时总觉得很复杂,很麻烦,是一个难点。

学习指针时还是要多结合实际对指针的利用来学,这样才能尽快搞懂。

指针应是跟变量绑定在一起开始学的,任何一个变量都包括地址和数据。

正常赋值是对数据操作的,而指针是对地址操作的。

不知道为什么许多教程可能认为这是个难点,所以就都独立出来讲。

导致学的时候迷迷糊糊一下子就过去,也不知道什么时候派上用场。

评论