【c语言】数组名和指针的区别

数组名和指针之间,经常会交替使用这两个变量,比如,把一个指针当成数组来使用,或者是把数组名赋值给指针,通过指针来访问数组成员变量,但是,数组名和指针之间到底有什么样的联系与区别,以及什么情况下该使用指针,什么情况下该使用数组名,我对这个做一个小小的解读。。 
这里写图片描述 
上图中,定义一个数组,数组名为arr,分别打印arr本身的地址arr首元素的地址,以及arr本身,以整型形式输出,发现,这三者的值是相同的。这里说明了一下这种情况。 
这里写图片描述 
在说明这种情况之前,我们先了解一下变量的三要素: 
红色圈代表:变量名称(如同人名。。) 
绿色圈代表:该变量,即名为arr变量自己的地址。该地址存储了arr变量 
蓝色圈代表:arr的值,为arr所指对象的地址。 
所以一个普通变量arr!=&arr的,arr的值和arr自身的地址是不同的,指针变量就是一个类型为指针的普通变量。


而在上面的运行结果中,我们发现arr==&arr,这说明arr的地址就是arr,arr代表一个地址,arr本身就是一个地址,又根据arr==&arr[0]可知,arr是arr数组首元素的地址,所以arr作为数组名时,它的红圈,绿圈和篮圈代表的是同一个含义——数组首元素的地址。 
这是数组名和指针不同的第一点: 
数组名取地址得到的是数组名所指元素的地址。 
对指针取地址得到的是指针变量自身的地址。


区别2: 
数组是固定大小的,数组一经定义,那么数组名就是一个指向数组首元素类型的常量指针,也就是说数组名是不允许更改的,而指针可以更改。 
数组名是常量指针,指针是变量指针。


区别3: 
1.当对数组名使用sizeof时,得到的是数组元素的个数乘元素类型的字节数,对指针sizeof得到的是指针类型的字节数。 
这里写图片描述

2.对数组名取&和对指针取&的意义不同。 
这里写图片描述 
上图可以看到对arr取地址后加1后,增大了36个字节,而对指针p取地址后加一,只增大了4个字节,所以说它们取地址后加一的能力不同。 
这两种情况下,数组不再当成常量指针来使用。 
总结: 
1.数组名代表了一个指向数组首元素的常量指针,一经定义,不可更改,数组名作为常量指针,其类型与数组元素类型相同。指针是变量指针,定义之后仍可更改,其类型在定义时确定。

2.当出现sizeof,和&操作符时,数组名不再当成指向一个元素的常量指针来使用,而指针仍当成指向一个元素的变量指针来使用。

对于使用指针和数组下标的选择: 
系统在使用数组下标对数组成员变量进行访问时,开销比较大,指针的访问效率是远远大于数组名的访问效率的。 
但是只有在指针正确访问时,才成比下标法更有效率。 
下标法更加容易理解,在可读性方面,也更加的具有优势,具体怎么选择,也没有一定的说法。

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值