数组名取地址的问题

9 views
Skip to first unread message

刘小林

unread,
Nov 3, 2009, 3:33:21 AM11/3/09
to ph4...@googlegroups.com
有哪位朋友可以讲讲数组名取地址的问题?在网上看了很多说法,实在是总结不出来个究竟。
很明显,如今的编译器(只考察了VC++ 2008和GCC 3.4.5)是支持数组名取地址的,那么对数组名取地址到底会得到什么?

老张

unread,
Nov 3, 2009, 9:53:31 PM11/3/09
to ph4...@googlegroups.com
啥意思?  c/c++ 中,数组名就是数组首地址,元素地址通过索引或者 数组名+偏移 取得。


2009/11/3 刘小林 <ziy...@gmail.com>

刘小林

unread,
Nov 4, 2009, 6:28:53 AM11/4/09
to ph4...@googlegroups.com
比如有
------------------------------------------------------------------------------------
int a[] = {1, 2, 4};
------------------------------------------------------------------------------------
那么, &a有什么内涵?能否详细的讲解一下?
2009/11/4 老张 <ada...@gmail.com>:

rainm...@foxmail.com

unread,
Nov 4, 2009, 10:28:45 AM11/4/09
to ph4nt0m
ph4nt0m, 您好

从数值上看,两者相同.

char a[10]
a == &a

对于局部变量,都是翻译成类似lea eax, [ebp-c]的形式. 是第一个元素所在堆栈的地址.
对于全局变量,直接翻译成类似mov eax, 427E34的形式. 第一个元素所在数据段地址

------------------
2009-11-04

-------------------------------------------------------------
发件人:刘小林
发送日期:2009-11-04 10:30:45
收件人:ph4nt0m
抄送:
主题:[Ph4nt0m] 数组名取地址的问题

X4ng

unread,
Nov 5, 2009, 1:32:08 AM11/5/09
to ph4...@googlegroups.com
数组名其实是一个指针变量
int a[] = {1,2,4};
&叫取地址运算符,这下明白了吧!
&a,就是取数组a的首地址.
 
我不知道你学C看的是那本书,建议你去看看人邮的《C和指针》还有《C专家编程》
 
 
 
--
世之奇伟
瑰怪
非常之观
常在于险远
而人之所罕至焉
故非有志者不能至也
msn:cmw...@hotmail.com
mail:x4n...@gmail.com

cnwill

unread,
Nov 5, 2009, 8:14:58 PM11/5/09
to Ph4nt0m
会得到数组的首地址,就像例子中的得到的就是a[0]的地址。

nafish

unread,
Nov 7, 2009, 6:10:47 AM11/7/09
to ph4nt0m
$ gcc -g -o main main.c
$ ./main
a=0xbf9df198
a+1=0xbf9df19c
&a=0xbf9df198
&a+1=0xbf9df1c0   //注意 0xbf9df1c0 - 0xbf9df198 = 40D 正好是sizeof a的大小
$ cat main.c
#include <stdio.h>

int main()
{
    int a[10] = {
        1, 2, 3, 4, 5,
        6, 7, 8, 9, 10,
    };
    printf("a=%p\n", a);
    printf("a+1=%p\n", a + 1);
    printf("&a=%p\n", &a);
    printf("&a+1=%p\n", &a + 1);
    return 0;
}
$ gdb main
GNU gdb (GDB) 7.0-ubuntu
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/baozhifei/main...done.
(gdb) break main
Breakpoint 1 at 0x80483ed: file main.c, line 8.
(gdb) run
Starting program: /home/baozhifei/main

Breakpoint 1, main () at main.c:8
8        };
(gdb) n
9        printf("a=%p\n", a);
(gdb) whatis a
type = int [10]
(gdb) whatis &a
type = int (*)[10]
(gdb) whatis &a + 1
type = int (*)[10]
(gdb) c
Continuing.
a=0xbffff3e8
a+1=0xbffff3ec
&a=0xbffff3e8
&a+1=0xbffff410

Program exited normally.
(gdb) quit

gdb说的很清楚了吧,对数组名取地址就相当于指向整个数组的一个指针。这样在加减指针运算的时候,步长是整个数组的大小。





在2009-11-03 16:33:21,"刘小林" <ziy...@gmail.com> 写道:
>有哪位朋友可以讲讲数组名取地址的问题?在网上看了很多说法,实在是总结不出来个究竟。
>很明显,如今的编译器(只考察了VC++ 2008和GCC 3.4.5)是支持数组名取地址的,那么对数组名取地址到底会得到什么?
>
>>



看陆川杨幂新片《琴棋书画》,品网易3D国韵网游《天下贰》

nafish

unread,
Nov 7, 2009, 6:01:41 AM11/7/09
to ph4nt0m
在2009-11-03 16:33:21,"刘小林" <ziy...@gmail.com
> 写道:
>有哪位朋友可以讲讲数组名取地址的问题?在网上看了很多说法,实在是总结不出来个究竟。
>很明显,如今的编译器(只考察了VC++ 2008和GCC 3.4.5)是支持数组名取地址的,那么对数组名取地址到底会得到什么?
>
>>



09年新晋3D主流网游《天下贰》,网易六年亿资打造

刘小林

unread,
Nov 7, 2009, 8:51:53 AM11/7/09
to ph4...@googlegroups.com
十分感谢你的回答,我受益匪浅。谢谢。

2009/11/7 nafish <naf...@126.com>:

老张

unread,
Nov 8, 2009, 3:59:44 AM11/8/09
to ph4...@googlegroups.com
数组名其实是一个指针量,而不是变量。它不允许被赋值。

&a == a 成立,这是由编译器保证的。对数组名使用 & 运算符,通常是为了取数组中元素的地址,而不是数组的地址。

a == &a[0] 成立,是 c 语法保证的。


另外使用反汇编去看这些信息,往往看到的是编译器优化过的,不但不能帮助理解,反而容易引起混淆。




2009/11/7 刘小林 <ziy...@gmail.com>

刘小林

unread,
Nov 8, 2009, 9:25:51 PM11/8/09
to ph4...@googlegroups.com
恩,还有更多?愿闻其详。

2009/11/8 老张 <ada...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages