C语言中对数组a再取址是什么
c
int a[5]; sizeof(a); sizeof(&a);
如上,a是数组名,那么a对C来说不就是数组a的首地址吗,那么&a又是什么意思?&a的内容是什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
c
int a[5]; sizeof(a); sizeof(&a);
如上,a是数组名,那么a对C来说不就是数组a的首地址吗,那么&a又是什么意思?&a的内容是什么?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
C语言有对于取址有两种模式,一种是直接取址,另一种是间接取址。对于上述例子来说,如果执行
sizeof(a)
,则返回数组的长度,对于数组来说,其内存结构是连续的,而且是定长的。我们令int *p = &a
,则p其实是指向数组a的指针,对于指针来说,其存储的是它所指向变量的内存地址,在32位系统中,地址一般存储为4个字节,在64位系统中存储为8个字节,所以sizeof(p)
返回4或者8。我们可以拿一个示例图来展示p和a的内存结果:
在上图中a的首地址就是0x1234,那么p的值即为0x1234,注意图中指针长度为4字节,即该图展示的是32位系统的指针。
&a的类型是指针,C标准里面没有地址这个概念。
a和&a的值是相同的,都等于
a[0]
的地址,区别是两者类型不同。用下面的代码打印一下就知道值是一模一样的了:
a
的类型是int [5]
,&a
的类型是int (*)[5]
。所以,sizeof(a)
求的是整个数组的字节数(一般的机子都是20),而sizeof(&a)
求的是一个指针的字节数,等于sizeof(unsigned long)
(32位的机子是4, 64位的机子是8)。另外,类型的不同在函数调用传参的时候也会造成区别。假设有如下三个函数:
fun1
和fun2
等价(数组退化为指针),可以接受a
,传&a
就编译不过了。相反,fun3
可以接受&a
,但是传a
就要报错了。类似的问题http://segmentfault.com/q/1010000002592221?_ea=149727
解惑的文章 http://www.dlifep.com/?p=348
如果不看文章,那么简单的说,就是a是个变量名,指示了数组,所以sizeof(a)才得到正确的值
sizeof(&a)自然是对首地址做运算了
请问sizeof是一个操作符还是一个函数?
a本身是一个引用变量,C是会给a本身分配一个内存地址,&a就是获取这个地址的引用。数组的内容是存放在堆中,其引用放在栈中,这样读取速度才比较快。a的值就是数组的首地址的引用。