1.数组的含义、定义与初始化方式
在对数组名指针进行理解分析之前 先来看看一维数组名关于指针的性质
我们通过编译器可以发现 arr和&arr的值相同
很明显的看出来数组名作为一种指针类型,具有相当明显的特殊性
在编译器中 无论是arr 还是 &arr 都会用$arr表示($为编译器取地址符)
即编译器会将没有添加$的编码名添加$
但添加和不添加&还是有区别的 虽然他们值相同
int main
{
char crr[5]="hello";
printf("%d\n",sizeof(crr)); //5
printf("%d\n",sizeof(&crr)); //4
printf("%d\n",strlen(arr));
return 0;
}
数组名被定义为指向数组名的指针常量
但在以下两中场合下,数组名并不是用指针常量来表示,就是当数组名作为sizeof操作符和单目操作符&的操作数时
上面这个代码块中可以看出 crr在没被添加&时作为一个真正的“数组名”,即sizeof所得到的是数组大小
但crr被添加&是被看作指向数组的指针,作为一个合格的指针必然逃不过被sizeof判定为4的命运
(值得注意的是只要数组名被运算、传参、赋值都会退化为某种类型的指针)
结论:被添加&的数组名是指向数组的指针,而没有被添加的数组名更像是数组的入口
接下来我们来看最让人头疼的二级指针
A==&A==&A[0]=&A[0][1] //其中只有A可以被看作数组入口 其他只能作为指向数组的指针;
也许看着很奇怪 所有的写法都不一样但就是能走到一个地址上去
其实每个都可以解释
A
在一维数组中就解释过 作为数组的入口 被sizeof使用 其在编译器中的本质还是&A
&A
此处还是作为数组名被使用 被指向第一个一维数组的地址即 &A[0]
&A[0]
指向数组第一个一维数组首地址
&A[0][1]
数组开头第一个元素
那此时 一维数组首地址和数组开头第一个元素不就是一个地址吗?
这只是我家在浙江和我家在温州一个道理 它们指向的是同一个地方
但作为指针它们的类型以及发生了变化
这里教一个简便方法
对A求地址 即A或&A
则往右寻找到其最近的数组元素的地址 就是它的值 即&A[0][0];
对A[1]求地址 即 &A[1]
则往右寻找到其最近的数组元素的地址 就是它的值 即&A[1][0];
对A+2求地址 即 A+2
则往右寻找到其最近的数组元素的地址 就是它的值 即&A[2][0];