所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

C语言中数组arr和 &arr对应的地址为什么一样?

发布时间:2020-04-12 01:27:42

资讯分类:c语言  数组  对应  arr  数组  地址  类型
C语言中数组arr和 &arr对应的地址为什么一样?

谢邀

静看电影 共享好时光

简单说

arr本身不是一个指针变量,不像一个指针需要另外的空间存储,所以arr本身用&取地址是没有意义的,或者说是不需要这个意义的,但是为了方便一些情况,规定&arr等于arr,也有觉得是&arr才是地址,arr才是强行规定等于&arr

详细说一下

arr是数组的开始地址,但是&arr不是地址的地址,&arr也是数组的开始地址它们值相同,类型不同,你的逻辑错在了没有全面理解C的类型系统和隐式转换规律

复杂回答:弄懂这个问题需要你了解C的类型系统和隐式转换的规律首先,你要知道什么是隐式转换,这个不解释了然后,C语言是存在数组类型的,对没错是数组类型,而这个类型在大多数情况下会隐式转换为它的元素的指针类型,

所以你定义了一个数组int arr[10],arr的类型实际上是int[10],但是因为大部分情况下的隐式转换,arr的类型会退化为int*大部分情况下都会发生隐式转换,不会发生隐式转换的情况有三个,sizeof运算的时候,取地址(&)运算的时候,字符串常量初始化时

这也就是为什么sizeof数组是整个数组的长度,不等于sizeof指针,在此我不想讨论C为什么要做这么多隐式转换。上面说&运算的时候不会发生隐式转换,所以&arr,就是取arr数组的地址,取数组的地址,在这里,既不是数组名的地址,也不是数组首元素的地址,arr就是数组,&arr就是取数组的地址,也就是整个数组在内存中的第一个位置的地址,这个运算结果的类型是数组的指针,也就是int(*)[10]。

arr的值在很多情况下会隐式转换为首元素地址,所以你在问题描述里就认为它就是首元素地址(但其实不是)&arr是数组的地址,碰巧和首元素地址相同但是他们类型不同,一个是int[10]隐式转换成的int*,另一个是int(*)[10]

静看电影 共享好时光

如果我的答案对您有一点点帮助的话 请关注噢 看到你的支持我会很开心的

C语言中数组arr和 &arr对应的地址为什么一样?

arr 表示数组的首地址,也表示数组第一个元素(下标为0)的地址,arr + 1 表示数组中下标为1的元素的地址;

&arr表示整个数组的开始地址,&arr + 1 表示 下一个数组空间的地址,即数组 (最后一个元素 + 1) 的地址。

C语言中数组arr和 &arr对应的地址为什么一样?

谢邀。不过不太懂,从网上找来的答案,希望对你有帮助。

arr本身不是一个指针变量,不像一个指针需要另外的空间存储,所以arr本身用&取地址是没有意义的,或者说是不需要这个意义的,但是为了方便一些情况,规定&arr等于arr,也有觉得是&arr才是地址,arr才是强行规定等于&arr

C语言中数组arr和 &arr对应的地址为什么一样?

首先明确c语言中地址就相当于指针,指针的意义就是访问存储到内存空间的内容;

其次,c语言的语法中说明,数组名即数组的首地址;

arr[0]是数组的第一个元素,&符在c语言的作用是取地址符;

32位机器上指针的内存空间是4个字节,为了能访问数组元素,所以相等

C语言中数组arr和 &arr对应的地址为什么一样?

这个对我而言太难了!不过查到的是这样的:指针可能不太好理解,举个简单理解的long a =1 和 int a = 1值是一样的指针的&arr的功能就有点像long转为了int。arr地址是整个数组的地址 &arr是第一个数字的地址两个虽然值相同但含义不同。操作arr和 &arr带来的结果也是不一样的。

希望对你有帮助!

C语言中数组arr和 &arr对应的地址为什么一样?

C语言规定单纯引用数组名时返回数组的起始地址。&是取地址运算符,例如&arr[0]返回第一个元素的地址,也就是数组的起始地址。没有对与错,只是人为规定的罢了。

留言与评论(共有 0 条评论)
   
验证码:
Top