一维数据与指针
1.一维数组的原理
1.数组名的真正作用:数组整个储存空间的首地址,也代表第0个元素的地址.
(1)找到地址(可以用数组名+偏移量,或者是取地址符完成)
(2)得到空间
由此可总结,两种找到地址和得到空间的方式实际是等价的。
深度挖掘:[]是一种运算符,参考地址[偏移]==*(参考地址+偏移量)。
所以as[3]和[3]as甚至等价,因为本质上都等于*(as+3)。
2.指针与一维数组某元素
(1)int型指针指向int型数组的意义
int*p=a:因为p=&a[0]. 所以p=&*(a+0)。
(2)比较指针p+1和数组名a+1的区别
p++ //p是指针变量
a++ //a是指针(地址)常量,不可被修改。
深度理解:数组名(地址常量)不可改变代表不可以自加,自减。*(a+1)中a并没有改变,可以这样使用。
但是不可以将已经开辟好的内存空间的地址改变。
(3)数组[下标]与*(指针+移动)与指针[下标]的实际应用--遍历数组
3.指针类型的数组(指针数组)
int arr[]={1,2,3,4,5} 这是一个整型数组,其中的元素都是整数。
int * pa[]={ &a , arr , arr+1 , &arr[0] } 这是一个指针类型的数组(指针数组),其中的元素都是指针。
下面的例子可以帮助理解这个概念
指针数组----找到地址 加星号----得到空间
4.指向一维数组的指针(数组指针)
int* x, //指向一个整数的指针 (士兵)
int(*m)[4]; //指向一个一维数组的指针 (百夫长)
int(*n)[3][4]; //指向一个二维数组的指针 (将军)
如何给数组指针赋值:
arr为元素间的偏移,&arr是整体数组的偏移
深刻理解:
首先注意:arr(数组名)只有在sizeof()中和&后才能表示整个数组类型的首地址,其余认作是0号元素的地址
arr:代表数组类型,因为其中有4(n)个int型的元素,所以该类型内存空间为16(4*n)。
*arr(元素):得到数组0号元素的空间,得到了0号元素“1”,且内存空间为4.
&arr(指向数组类型的指针变量):找到整个数组类型的地址,且内存空间为4.
*&arr:代表数组类型,因为其中有4(n)个int型的元素,所以该类型内存空间为16(4*n)。
由此可以更加深刻的理解arr和&arr的关系。