指针和数组
关于C语言详解系列博客的目录: //blog.csdn.net/snake_lp/article/details/78630717
一,暧昧关系
指针和数据为什么需要一起分析呢?因为他们存在很多的暧昧关系,使得我们学习其他也比较的乱。
对于单独的数组,其实是很好理解的。如果在内存中看的话,就是以数组名为基地址的,具有一定长度的数据段。对数据段中数据的读写操作就是通过基地址加上偏移地址的方式来对数据进行定位并实现数据的读写操作。
在引入内存的概念之后,对于数组而言存在地址一说的。而指针刚好就是表示的数据在内存中的地址。所以数组和指针之间存在必然的联系。
但是指针的实质是一个变量,只是变量存储的内容为数据的地址。而数组就是一个连续存储空间的同种类型变量的集合。
二,差异点
1.指针是一个单独的变量,只是指向其他变量的地址。我们可以理解为间接访问,通过指针去访问指针所指向的变量;
数组是一组连续的元素并且真实存储元素的内容,数组名可以相当于一个指针,代表数组的基地址。
int a [10]; //系统实际就分配了10个int类型的连续的内存单元
int * p = a; / *系统值分配了一个int类型的地址的内存单元。因为p只是一个变量,存储的是int类型变量的地址。其实这种赋值语句等价于int * p =&a [0 ]; * /
就指针p而言,也可以通过指针的移动达到对数组元素间接访问的目的。
2. sizeof对于指针变量和数据的数量是不一样的。
int a [10]中是实实在在的连续数据,所以其占用的内存空间是40个字节。所以sizeof运行的结果就是40个字节
int * p = a的实质就是一个变量,所以它占用的内存空间就只有一个变量的空间,只有4个字节
3.以数组作为形参的函数,它的参数传递方式是指针传递。在这个时候,就可以把数据当作指针来看待了。
三,指针数组和数组指针
int(* p)[10]; / *数组指针,为指针类型,表示指针指向一个长度为10的二维数组的第一行的行地址。一行* /
int *(p [10]); / *指针数组,为数组类型,表示一个特定长度的数组存储了指针类型的数据,数组的元素都是指向变量的地址* /
四,指针和常量的组合
int const * p; / *首先const修饰的是* p,所以* p是常量,即* p不能做赋值运算。但是p仍然是变量,可以进行各种运算,所以可以通过改变p的指向来间接的改变* p的值,但是* p仍为常量* /
int * const p; / * const的修饰的是P,所以p初始化的时候就应该指定地址。但是p指向的变量是可以更新数值的,所以可以改变* P的值* /
const int * p; / *和2一致* /