关于C语言数组的地址的疑问??
inta[5]假设a的地址是1000,是不是a这个地址里面的空间存储的值(地址)也是1000?所以a才会等于&a?...
int a[5]
假设a的地址是1000,是不是a这个地址里面的空间存储的值(地址)也是1000?
所以a才会等于&a? 展开
假设a的地址是1000,是不是a这个地址里面的空间存储的值(地址)也是1000?
所以a才会等于&a? 展开
4个回答
展开全部
当你写int a[5]时,编译器会分配sizeof(int) * 5的连续内存空间存放数组元素。数组名只是个常量,不占任何存储空间,它用名字a表示。打开反汇编看看,凡是用到数组名的地方都是都是直接写的地址值,而不是像变量那样通过访问一个内存地址获得数值,也就是说就是个立即数。
C的语法中有些东西可以在机器的层面上解释,有些要在编译器的层面上解释。a这个数组名就要在编译器的层面上解释,编译器把数组名和数组地址当成一个东西,它与变量名是指变量的值而不是地址不同。没有为什么,编译器就是这么对待数组名的,就像字符串变量名指的就是首字符地址一样,这是个规定。如果非要说为什么,那就是将a当作数组内容没有意义,例如,把a当作实参传入函数,只是传的数组地址,效率高,如果把a当作数组内容看待,那就意味着要把数组内容复制一份再传到函数里面了。
a和&a确实是一个值,因为a本身就是个常数没有地址,编译器并没有将&a当作错误处理,而是友好的将其翻译成a了。由于a是常数,你也不能给a再赋值了,而你写a=b也没问题,编译器还是会友好的通过,只是a的值并没有被改编而已。
你之所以会问a为什么等于&a的原因是你把“名字”和“变量”搞混了,对变量来说&变量是指变量的地址,而数组名本身是个名字不是变量,因此它也不能被赋值,你可以翻翻所有的C语言书没有将a称作数组变量的,它只是个数组名,真正的数组变量(其实称作数组指针)这么定义:int (*b)[5]; 你可以把a赋给b,通过(*b)[1]访问数组元素。看,真正的数组变量访问数组元素的方式都和数组名不同。
C的语法中有些东西可以在机器的层面上解释,有些要在编译器的层面上解释。a这个数组名就要在编译器的层面上解释,编译器把数组名和数组地址当成一个东西,它与变量名是指变量的值而不是地址不同。没有为什么,编译器就是这么对待数组名的,就像字符串变量名指的就是首字符地址一样,这是个规定。如果非要说为什么,那就是将a当作数组内容没有意义,例如,把a当作实参传入函数,只是传的数组地址,效率高,如果把a当作数组内容看待,那就意味着要把数组内容复制一份再传到函数里面了。
a和&a确实是一个值,因为a本身就是个常数没有地址,编译器并没有将&a当作错误处理,而是友好的将其翻译成a了。由于a是常数,你也不能给a再赋值了,而你写a=b也没问题,编译器还是会友好的通过,只是a的值并没有被改编而已。
你之所以会问a为什么等于&a的原因是你把“名字”和“变量”搞混了,对变量来说&变量是指变量的地址,而数组名本身是个名字不是变量,因此它也不能被赋值,你可以翻翻所有的C语言书没有将a称作数组变量的,它只是个数组名,真正的数组变量(其实称作数组指针)这么定义:int (*b)[5]; 你可以把a赋给b,通过(*b)[1]访问数组元素。看,真正的数组变量访问数组元素的方式都和数组名不同。
2011-05-21
展开全部
当然不是啊。。。
存储的位置是1000,是他的地址,这个地方存放的是它的值
存储的位置是1000,是他的地址,这个地方存放的是它的值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
a不等于&a,一个变量的值和变量存放的地址是不一样的。
用来存放数组的区域是一块在栈中静态分配的内存(非static),而数组名是这块内存的代表,它被定义为这块内存的首地址。这就说明了数组名是一个地址,而且,还是一个不可修改的常量,完整地说,就是一个地址常量。数组名跟枚举常量类似,都属于符号常量。数组名这个符号,就代表了那块内存的首地址。注意了!不是数组名这个符号的值是那块内存的首地址,而是数组名这个符号本身就代表了首地址这个地址值,它就是这个地址,这就是数组名属于符号常量的意义所在。由于数组名是一种符号常量,因此它是一个右值,而指针,作为变量,却是一个左值,一个右值永远都不会是左值,那么,数组名永远都不会是指针!
数组名是一个地址,一个符号地址常量,不是一个变量,更不是一个作为变量的指针
用来存放数组的区域是一块在栈中静态分配的内存(非static),而数组名是这块内存的代表,它被定义为这块内存的首地址。这就说明了数组名是一个地址,而且,还是一个不可修改的常量,完整地说,就是一个地址常量。数组名跟枚举常量类似,都属于符号常量。数组名这个符号,就代表了那块内存的首地址。注意了!不是数组名这个符号的值是那块内存的首地址,而是数组名这个符号本身就代表了首地址这个地址值,它就是这个地址,这就是数组名属于符号常量的意义所在。由于数组名是一种符号常量,因此它是一个右值,而指针,作为变量,却是一个左值,一个右值永远都不会是左值,那么,数组名永远都不会是指针!
数组名是一个地址,一个符号地址常量,不是一个变量,更不是一个作为变量的指针
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
打个比方:
a的地址就好比a的房间。
而a的值就是房间里面存放的东西。
a不等与&a
a等于*&a
&a只是a的地址
a的地址就好比a的房间。
而a的值就是房间里面存放的东西。
a不等与&a
a等于*&a
&a只是a的地址
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询