数组和指针是C中常见的数据结构,和基本类型不同,这两个数据结构可以表示多个数据的集合。
在理解和区分这两个概念前,先了解一下内存模型。
内存就相当于街道两边的房子,内存地址,就是房子的门牌号。内存和房子一样,可以存放需要的数据。
现在问题就来了, 怎么描述一排排的房子【内存数据】呢?
这里有两个方案,第一种,就是数组,第二种,就是指针。 这两个东东用来描述“连续且有相同结构的内存数据”。
这两种数据的共有特点是:
1. 表示一列的连续相同的内存数据。【数组用下标的方式, 而指针用前后移动的方式】
2. 鉴于第一点,可以通过遍历的方式来访问。
先看数组:
数组相当于不可变的一块区域, 不可变,是指,一旦划分好了, 就不能再增加数目进去, 也不容许它更换名称。
【说明:】数组是划分好的存储区域, 不容许地址迁移。
比如:
int a[] ={1, 2, 3};
a = b; //更改了名称, 这是不允许的。即不容许地址迁移
这个可以比方一个楼层的房子, A栋101, A栋102, A栋103. 这个划分的区域是没法修改的, 是一个标准信息存储空间, 如果你将A栋变成了B栋的内容,整个社区将彻底乱套,原因是:数组的作用是将位置固定。 方便找到存储位置。
再看指针:
需要说明的是,指针并没有划分一个区域存储数据, 其作用是,对已经划分好的数据区域进行索引。 这个就类似花名册, 黑板报, 他并没有实际内容, 只是一个索引记号,通过记号,来操作存储其上的数据。
以传达室的黑板为例,今天可以写A101来了一封新, 明天可以写B102欠费信息, 擦除重写,一切都OK. 人们可以通过这个黑板信息查到具体事情发生的地理位置【是A101还是B103】, 由指针的历史地位决定,它的作用是: 通过指向一个具体的存储位置, 从而让存储的内容产生作用。
int *p = menA;
p = menB;
上面就是一个指针的更替的例子. 指针p保存的都是一个地址, 也就是索引.
在c语言中,函数的参数中存在数组的话,会将其低俗为指针, 所以在函数中,看不到数组, 看到的只是指针【这个有点寂寞】。寻根究底的话: 原理是: 传参的时候, 参数要复制, 但是为了效率,设计C的时候,不可能让你把内存给复制一遍,所以只能转为指针进行处理。