C语言中对数组名指针的实用理解方法(A A[0] A[0][0]取地址区别)

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];

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值