zhaopengfei 发表于 2014-2-27 22:24:24

变量名和变量的地址是什么关系?

越来越搞不清了,比如int a 那么变量名a和变量的地址是什么关系?? 编程显显示a 和&a 是一样的 ,这算怎么回事?   
         又比如int a 那么a是数组的首地址,那么&a就应该是首地址的地址,怎么会 a 和&a还 是一样的?
哪个理解这个东西的人来解释一下呗,感谢!

oggplay 发表于 2014-2-27 23:27:38

本帖最后由 oggplay 于 2014-2-27 23:38 编辑

先看我的程序结果

a就是一个变量,存储的是一个整形变量。&a表示取这个变量的地址。
再看b数组,b本身是一个指针,b表示的是数组第一个值,b表示第二个。
所以*b就等于b,b+4地址存储的就是数组第2个的值(int整形变量占4个字节,)。
从汇编角度讲它们都是一个地址标签,标签紧跟着就是这个地址里存储的值。以下是AT&T汇编语法.section .data
a:
   .int 10
b:
   .int 0
   .int 0
   .int 0
   .int 0
   .int 0
.int 0
.int 0
.int 0
.int 0
.int 0
.int0

zhaopengfei 发表于 2014-2-27 23:45:47

oggplay 发表于 2014-2-27 23:27 static/image/common/back.gif
先看我的程序结果

a就是一个变量,存储的是一个整形变量。&a表示取这个变量的地址。


这个我理解,那b,b本身就是一个指针,那么&b就是取指针b的地址, 那b和&b的结果是一样的,这个怎么解释呢??

oggplay 发表于 2014-2-27 23:49:21

zhaopengfei 发表于 2014-2-27 23:45 static/image/common/back.gif
这个我理解,那b,b本身就是一个指针,那么&b就是取指针b的地址, 那b和&b的结果是一样的,这个怎么解释 ...

还不明白阿,b是一个指针,也就是内存的地址例如 0x80480000,再取b的地址当然还是这个

zhaopengfei 发表于 2014-2-28 00:12:27

oggplay 发表于 2014-2-27 23:49 static/image/common/back.gif
还不明白阿,b是一个指针,也就是内存的地址例如 0x80480000,再取b的地址当然还是这个

我的意思是这样,b是个地址,那再取b的地址就是双重指针,即取的是地址的地址,而不是b这个地址本身。

5个木头心 发表于 2014-2-28 02:49:52

- -C 语言的魅力 就是能 访问到 变量的地址。 应该是内存的某的地方

CityMack 发表于 2014-2-28 06:47:20

不懂帮顶。赚鱼币{:1_1:}{:1_1:}{:1_1:}{:1_1:}

无名侠 发表于 2014-3-1 10:01:05

变量名是变量地址的别名。:big:big

zhaopengfei 发表于 2014-3-1 16:06:03

无名侠 发表于 2014-3-1 10:01 static/image/common/back.gif
变量名是变量地址的别名。

不要来误导别人哦亲 ,这样不好

-/_Z.t` 发表于 2014-3-1 16:35:41

房子和人的关系:lol:

zhongguoren 发表于 2014-3-5 13:04:02

不用太纠结。。。
a是给编译器看的。int a的意思是,在内存中开辟两个字节或四个字节的空间,标记为a。
电脑只会把那段内存的首地址记下,也就是&a的值;a和&a绝不相同。
至于int a,这个还是给编译器看的,开辟一段连续的内存空间,8个字节或16个字节。a的值为数组首地址。&a无意义。
建议学一下汇编。
----本人愚见,请多指教

zhaopengfei 发表于 2014-3-5 16:11:56

zhongguoren 发表于 2014-3-5 13:04 static/image/common/back.gif
不用太纠结。。。
a是给编译器看的。int a的意思是,在内存中开辟两个字节或四个字节的空间,标记为a。
电 ...

你自己去试试吧,int a; 然后a 和&a 绝对是一回事儿。

zhongguoren 发表于 2014-3-5 22:19:31

zhaopengfei 发表于 2014-3-5 16:11 static/image/common/back.gif
你自己去试试吧,int a; 然后a 和&a 绝对是一回事儿。

#include<stdio.h>

void main()
{
        int a=12;
        printf("%d %d",a,&a);
}你运行一下看看,怎么可能一样。。。。我们学的这些语言都只是符号,最终都由编译器转换为机器码供电脑识别。

zhaopengfei 发表于 2014-3-5 23:25:14

zhongguoren 发表于 2014-3-5 22:19 static/image/common/back.gif
你运行一下看看,怎么可能一样。。。。我们学的这些语言都只是符号,最终都由编译器转换为机器码供电脑识 ...

我说错了,应该是int a;这里的 a 和 &a是一样的,前边那个确实不一样,上边你说&a没有意义是什么意思?我学过汇编的 ,但还是不理解你说的意思

zhongguoren 发表于 2014-3-7 00:10:43

zhaopengfei 发表于 2014-3-5 23:25 static/image/common/back.gif
我说错了,应该是int a;这里的 a 和 &a是一样的,前边那个确实不一样,上边你说&a没有意义是什么意思 ...

int a里的a是这段内存空间的首地址,你对a用取地址符,就是没意义的。
你为什么用&,因为你想获得某个对象的地址继而进行一些操作。你对地址求地址,除了多为数组的情形,都是没啥意义的。这和 int a,b; b=*a;一样,没意义。
从汇编角度讲,这里的a就是一个物理内存地址,你对他求地址,编译器果断就把你那个&忽略了。
你可以写段代码反汇编一下,你会发现对a操作,对&a操作的汇编代码基本一样。#include<stdio.h>

void main()
{
        int a={12};
        int b;
        b=a;//不考虑意义,忽略编译警告
        b=&a;
}

zhaopengfei 发表于 2014-3-7 14:38:35

zhongguoren 发表于 2014-3-7 00:10 static/image/common/back.gif
int a里的a是这段内存空间的首地址,你对a用取地址符,就是没意义的。
你为什么用&,因为你想获得某个 ...

好嘛,果然厉害啊,我懂啦
页: [1]
查看完整版本: 变量名和变量的地址是什么关系?