关于《看了这张图你马上明白什么是变量、指针和地址值(更正)》一帖的不同看法
愚见,仅供参考!也欢迎大家加入讨论请对照原帖图片内容顺序往下查看...
1. 建议修正用语
*无“地址值”一说吧,“地址”这个概念还可以分的更小吗?
变量 变量的地址 地址中存储段内容
i 0012ff74 778899aa
p(非*p,int *是p的类型)
...
变量:有2样重要的东西,它的地址以及它的(值的)类型(类型同时定义了数据长度);最后才是它的值!
2. 多处错误
= 0012ff74 应为 ebp-8 = 0012ff74
3. 不可思议的地方
为什么非要把指针当成所谓的“一种特殊的变量”?请仔细斟酌上面“变量”的说明。
为啥人们总是喜欢“创造”更多的概念让自己变得晕乎呢?
不过这好像是M$的传统...看看Windows编程便可略知一二
4. 关于[],请思考
lea eax, dword ptr ss:
这一句取的又是啥呢?
我的建议
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;
}
关于例子的总结:变量的地址是物理性质的,是无法改变的,
所能改变的只是该地址处的存储内容罢了!
本帖最后由 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了.
=================================
抱歉我稍早打太快所以造成了一些錯誤, 現在修正一下.
我主要是想說指針的功用就是指向變數的位址, 而不是指向儲存一個變數的位址.
kikiatw 发表于 2014-5-13 21:18 static/image/common/back.gif
我只學過c, 就c的那部份來說它用
int i=5;
int *p;
“*p = &i 讓我很無法接受”
由于你连这一句都没有整明白,所以你后面的讨论也都错误!
你该补补c的指针部分了... 原帖呢?。。。好吧我是来打酱油的。。。我不记得原帖了
不过,我个人很不理解为什么大家讨论C语言指针问题的时候老是用汇编什么的来理解。。。这种理解哪怕在某种操作系统环境下是正确的,在另一个操作系统环境下就很可能是错误的。C语言问题最权威的答案都在C语言标准里。
关于指针,我的理解是:
“指针变量”和“指针”都是指针类型;就好比整型变量 int a;和5都是int类型
“指针变量”里存储的是指针类型的值;就好比整型变量 int a;里存储的是int类型的值
上面说的“指针类型的值”并不完全等同于地址值,还包括了诸如处于该地址的变量的大小,如何解释该变量(是用补码解释的整数类型还是IEEE754规范解释的浮点型还是其它的自定义类型) kikiatw 发表于 2014-5-13 21:18 static/image/common/back.gif
我只學過c, 就c的那部份來說它用
int i=5;
int *p;
这位大哥。。。我看不懂你写得代码 本帖最后由 zhihuzheye 于 2014-10-31 19:58 编辑
大家不要被原文误导了...
原文地址:http://bbs.fishc.com/thread-35164-1-1.html
页:
[1]