数组!=指针


转载请注明来源 

参考大神的文章:http://blog.csdn.net/imred/article/details/45441457
关于数组和指针的问题,这个是在看了大神讲解的文章之后自己的一个理解。

 

首先想要了解清楚这个概念,就需要理解左值和右值的概念,什么是左值和右值?
在我看来,这比较通俗易懂,拿一个变量来举例。
int x=0;
当x作为一个目标操作数时,相当于一个对象,一个容器。(x=5,这个时候x是左值,5是右值。)
当x作为一个源操作数时,仅仅代表一个他所存储的值,一个字面量。(y=x,这个时候x是右值,y是左值,x作为右值的体现是0这个字面量)
这是我个人的理解,简单概括就是左值相当于目标操作数,右值相当于源操作数。

 

好,如果理解了左值和右值的概念再来看数组和指针的区别。
一个普通的变量,在上面也说了,作为左值时是一个对象和容器,作为右值时是他所存储的值这个字面量。

 

再来说为什么大家会普遍把数组当作指针呢,这要从一个特性说起,即当数组作为右值(源操作数)时,它返回的并不是数组值本身,而是数组的地址

我举一个简单的例子:

int arr[];

x=arr;

我们姑且先不论x是什么类型的变量,在这个时候它得到的应该是arr这个数组的地址值,而不是数组的元素。

即当数组作为右值时不像其他变量返回的应该是变量所存储的字面量,而是其地址。

正是这一特性导致了指针==数组这样一个概念的存在。

为什么说这个概念是错误的呢?

看我下图的这段测试


可以看到,arr1定义为一个指针,arr2定义为一个数组。

当我们对这两个变量同时进行取地址的时候,可以看到&arr1!=arr1,这很正常对吧。

但是&arr2==arr2,发现没有,这就是问题所在了,对数组取地址得到的地址值和数组本身相同,或者从指针的角度理解起来,这是很反常的。

 

但是,我们换个角度,以一个普通的变量来理解。

同样的,int x;

&x返回的应该是x的地址;

那对于数组arr[]来说

&arr返回的是arr[]的地址,在这里是没有问题的。

 

唯一特殊的地方在哪里,在arr作为右值时返回的是其地址这一特性上。大神的文章里面说到:

因为数组无法像普通对象那样返回它的值,它的元素可能有成百上千个,但作为一个左值时——比如作为取地址操作符的操作数时,数组就是作为一个数组对象而出现的,而不是指针,取地址返回一个指向数组的指针,而不是指向指针的指针。

 

最后我的结论就是,数组就是数组,和普通变量以及指针都不同,有其自己的特性,并不能简单地把其当作指针,同时可能会遇到或者说需要规避的一个问题就是,不要把数组作为指针来取地址,对一个数组arr[]和指针p来说,&arr==arr而&p!=p 。这个问题参考大神举的例子:

 

另外,刚刚测试又发现一点,即数组作为参数传递到函数当中后,其特性就完全和指针一样,上述的问题在参数传入的函数中就不存在,即函数的参数中,编译器把数组名理解成为一个指针。


仅仅是个人理解,如有错漏之处希望大家指出,谢谢。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值