鱼C论坛

 找回密码
 立即注册
查看: 2046|回复: 5

[技术交流] 关于《看了这张图你马上明白什么是变量、指针和地址值(更正)》一帖的不同看法

[复制链接]
发表于 2014-5-13 20:48:36 | 显示全部楼层 |阅读模式

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

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

x
愚见,仅供参考!也欢迎大家加入讨论
请对照原帖图片内容顺序往下查看...


1. 建议修正用语
*无“地址值”一说吧,“地址”这个概念还可以分的更小吗?

变量      变量的地址    地址中存储段内容
i         0012ff74      778899aa
p(非*p,int *是p的类型)   
...

变量:有2样重要的东西,它的地址以及它的(值的)类型(类型同时定义了数据长度);最后才是它的值!


2. 多处错误
[ebp-8] = 0012ff74     应为    ebp-8 = 0012ff74


3. 不可思议的地方
为什么非要把指针当成所谓的“一种特殊的变量”?请仔细斟酌上面“变量”的说明。
为啥人们总是喜欢“创造”更多的概念让自己变得晕乎呢?
不过这好像是M$的传统...看看Windows编程便可略知一二


4. 关于[],请思考
lea eax, dword ptr ss:[ebp-8]
这一句取的又是啥呢?


我的建议
1. 请参考nasm关于取地址与取值与masm的不同点

2. 多看看c代码对应的汇编输出,多单步调试

3. c中的参数是按值传递的!
   请不要对此句话不以为然!

   提供两个小例子

//例1
#include <stdio.h>

void SwapAddress(int *a, int *b)
{
    int *t;
   
    t = a;
    a = b;
    b = t;
}

int main(int argc, char *argv[])
{
    int i = 123, j = 888;
    int *pi = &i, *pj = &j;
   
    printf("address of i: %p, address of j: %p\n", pi, pj);

    SwapAddress(pi, pj);

    printf("\n***AND NOW***\n");
    printf("value of pi: %p, value of pj: %p\n", pi, pj);

    return 0;
}

//例2:
#include <stdio.h>

void SwapAddress(int **a, int **b)
{
    int *t;
   
    t = *a;
    *a = *b;
    *b = t;
}

int main(int argc, char *argv[])
{
    int i = 123, j = 888;
    int *pi = &i, *pj = &j;

    printf("address of i: %p, address of j: %p\n", pi, pj);

    SwapAddress(&pi, &pj);

    printf("\n***AND NOW***\n");
    printf("value of pi: %p, value of pj: %p\n", pi, pj);

    return 0;
}

关于例子的总结:变量的地址是物理性质的,是无法改变的,
所能改变的只是该地址处的存储内容罢了!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-13 21:18:09 | 显示全部楼层
本帖最后由 kikiatw 于 2014-5-14 00:51 编辑

我只學過c, 就c的那部份來說它用
int i=5;
int *p;
*p = &i 讓我很無法接受
為什麼不直接 p = &i 把p 指向 i 就好了, 指針嘛, 就是指向一個位址的東西, 把指針搞得像指針的指針會更混亂.

我們用一個實際的例子來看:
*p = &i
&(*p) = &&i
p = &&i
也就變成了指針的指針了, 問題越弄越複雜
假設p的位址是0x5555, 0x5555裡面存著一個數值為 0x6666
i的位址是0x7777 , 0x7777裡面存著的數值為5
*p = &i 就是 0x5555 裡面存放的數值改成了 0x7777(這是錯誤的)  *p = &i 就是指向0x6666的內容(未知數)改成0x7777
所以 p = 0x6666 , *p = 0x7777
那5 這個數字要怎麼取?
用**p 去取嗎? 編譯不會過的吧
不如直接把 p=&i
然後*p 就取得5了.

=================================
抱歉我稍早打太快所以造成了一些錯誤, 現在修正一下.
我主要是想說指針的功用就是指向變數的位址, 而不是指向儲存一個變數的位址.



点评

这位大哥。。。我看不懂你写得代码  详情 回复 发表于 2014-5-13 22:09
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-13 22:03:15 | 显示全部楼层

“*p = &i 讓我很無法接受”
由于你连这一句都没有整明白,所以你后面的讨论也都错误!
你该补补c的指针部分了...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-13 22:07:19 | 显示全部楼层
原帖呢?。。。好吧我是来打酱油的。。。我不记得原帖了
不过,我个人很不理解为什么大家讨论C语言指针问题的时候老是用汇编什么的来理解。。。这种理解哪怕在某种操作系统环境下是正确的,在另一个操作系统环境下就很可能是错误的。C语言问题最权威的答案都在C语言标准里。

关于指针,我的理解是:
“指针变量”和“指针”都是指针类型;就好比整型变量 int a;和  5都是int类型
“指针变量”里存储的是指针类型的值;就好比整型变量 int a;里存储的是int类型的值
上面说的“指针类型的值”并不完全等同于地址值,还包括了诸如处于该地址的变量的大小,如何解释该变量(是用补码解释的整数类型还是IEEE754规范解释的浮点型还是其它的自定义类型)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-13 22:09:09 | 显示全部楼层
kikiatw 发表于 2014-5-13 21:18
我只學過c, 就c的那部份來說它用
int i=5;
int *p;

这位大哥。。。我看不懂你写得代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-10-30 13:31:58 | 显示全部楼层
本帖最后由 zhihuzheye 于 2014-10-31 19:58 编辑

大家不要被原文误导了...
原文地址:http://bbs.fishc.com/thread-35164-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 03:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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