数组是特殊的指针,及数组为type * const p类型,这也就解释了数组无法进行赋值即a=b是不合法的,因为数组的地址是不能改变的。反过来对于一个普通的指针int * p,p[0]是合法的,值为*p。借由以下两点可以加深对数组的理解和印象。
1、在函数里 void f(int *a)
void f(int a[])
void f(int [])
woid f(int )
是等价的
2、(a+n)=a[n],两者完全等价,在函数里给a[n]赋值也会改变函数外a[n]的值,因为函数传过来的是数组的地址,通过地址就可以直接改变地址对应的值。
3、可以用指针完成数组的访问,切片等。
eg 对数组a,记录其a[i:j]
for (p=&a[i],k=0;k<j-i;k++){
*(p+j)
}
还可以在数组末尾加上一个数组其它元素中不可能出现的哨兵元素,靠它进行停止访问,如在正数数组末尾加上-1
4、动态分配数组内存
malloc:动态分配内存
int a;
a=(int )malloc(10sizeof(int));//以字节为单词
//malloc 是void类型,需要做强制类型转换
//由于上述数组和指针的关系,我们可以把a当作数组用
free(a);//在用完之后再把a占用的内存释放掉
5、因为在函数中的数组只是输入了一个地址,因此我们无法通过sizeof(a)/sizeof(a[0])来得出a的长度,因为在函数中输入数组时通常会同步输入数组的大小。