鱼C论坛

 找回密码
 立即注册
查看: 2919|回复: 15

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

[复制链接]
发表于 2014-2-27 22:24:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
越来越搞不清了,比如int a 那么变量名a和变量的地址是什么关系?? 编程显显示a 和&a 是一样的 ,这算怎么回事?   
           又比如int a[4] 那么a是数组的首地址,那么&a就应该是首地址的地址,怎么会 a 和&a还 是一样的?
  哪个理解这个东西的人来解释一下呗,感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-27 23:27:38 | 显示全部楼层
本帖最后由 oggplay 于 2014-2-27 23:38 编辑

先看我的程序结果

a就是一个变量,存储的是一个整形变量。&a表示取这个变量的地址。
再看b数组,b本身是一个指针,b[0]表示的是数组第一个值,b[1]表示第二个。
所以*b就等于b[0],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
2014-02-27 23:16:30 的屏幕截图.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-27 23:45:47 | 显示全部楼层

这个我理解,那b[4],b本身就是一个指针,那么&b就是取指针b的地址, 那b和&b的结果是一样的,这个怎么解释呢??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-27 23:49:21 | 显示全部楼层
zhaopengfei 发表于 2014-2-27 23:45
这个我理解,那b[4],b本身就是一个指针,那么&b就是取指针b的地址, 那b和&b的结果是一样的,这个怎么解释 ...

还不明白阿,b是一个指针,也就是内存的地址例如 0x80480000,再取b的地址当然还是这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-28 00:12:27 | 显示全部楼层
oggplay 发表于 2014-2-27 23:49
还不明白阿,b是一个指针,也就是内存的地址例如 0x80480000,再取b的地址当然还是这个

我的意思是这样,b是个地址,那再取b的地址就是双重指针,即取的是地址的地址,而不是b这个地址本身。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-28 02:49:52 | 显示全部楼层
- -  C 语言的魅力 就是能 访问到 变量的地址。 应该是内存的某的地方
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-28 06:47:20 | 显示全部楼层
不懂帮顶。赚鱼币{:1_1:}{:1_1:}{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-1 10:01:05 | 显示全部楼层
变量名是变量地址的别名。:big:big
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-1 16:06:03 | 显示全部楼层
无名侠 发表于 2014-3-1 10:01
变量名是变量地址的别名。

不要来误导别人哦亲 ,这样不好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-1 16:35:41 | 显示全部楼层
房子和人的关系:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-5 13:04:02 | 显示全部楼层
不用太纠结。。。
a是给编译器看的。int a的意思是,在内存中开辟两个字节或四个字节的空间,标记为a。
电脑只会把那段内存的首地址记下,也就是&a的值;a和&a绝不相同。
至于int a[4],这个还是给编译器看的,开辟一段连续的内存空间,8个字节或16个字节。a的值为数组首地址。&a无意义。
建议学一下汇编。
----本人愚见,请多指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-5 16:11:56 | 显示全部楼层
zhongguoren 发表于 2014-3-5 13:04
不用太纠结。。。
a是给编译器看的。int a的意思是,在内存中开辟两个字节或四个字节的空间,标记为a。
电 ...

你自己去试试吧,int a; 然后a 和&a 绝对是一回事儿。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-5 22:19:31 | 显示全部楼层
zhaopengfei 发表于 2014-3-5 16:11
你自己去试试吧,int a; 然后a 和&a 绝对是一回事儿。
#include<stdio.h>

void main()
{
        int a=12;
        printf("%d %d",a,&a);
}
你运行一下看看,怎么可能一样。。。。我们学的这些语言都只是符号,最终都由编译器转换为机器码供电脑识别。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-5 23:25:14 | 显示全部楼层
zhongguoren 发表于 2014-3-5 22:19
你运行一下看看,怎么可能一样。。。。我们学的这些语言都只是符号,最终都由编译器转换为机器码供电脑识 ...

我说错了,应该是int a[4];这里的 a 和 &a是一样的,前边那个确实不一样,上边你说&a没有意义是什么意思?  我学过汇编的 ,但还是不理解你说的意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-7 00:10:43 | 显示全部楼层
zhaopengfei 发表于 2014-3-5 23:25
我说错了,应该是int a[4];这里的 a 和 &a是一样的,前边那个确实不一样,上边你说&a没有意义是什么意思 ...

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

void main()
{
        int a[4]={12};
        int b;
        b=a;//不考虑意义,忽略编译警告
        b=&a;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-7 14:38:35 | 显示全部楼层
zhongguoren 发表于 2014-3-7 00:10
int a[4]里的a是这段内存空间的首地址,你对a用取地址符,就是没意义的。
你为什么用&,因为你想获得某个 ...

好嘛,果然厉害啊,我懂啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 10:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表