打印

建议取消“间接访问运算符”这个名字!

[复制链接]
3164|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
不光写程序|  楼主 | 2011-8-29 18:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C语言中有的指针是容易把人弄晕的一个知识点。比如int *p=0x10000; *p=1;,后面的那个运算符“*”叫做“间接访问运算符”,所以这句话的意思是把1赋值给以p中的数据为地址存储单元中,就是存储单元0x10000中为1,不是直接把1赋值给p,而是间接访问了一下。
我们再来看看下面这句话:*((int *) 0x11111)=1;,这句话是把1赋值给谁呢?前面的0x11111被强制转换为指向int类型的指针,指针本质就是地址,既然最外面的“*”叫做“间接访问运算符”,所以这句话的意思应该是把1赋值给以存储单元0x11111中的数据为地址的单元中,假如0x11111中的值为0x10000,那么就是把1赋给了存储单元0x10000中;但是事实并非如此,上面那句话执行过后0x11111中的值变成了1,就是1被直接赋值到了存储单元0x11111中,好像没有间接访问啊?
所以个人认为“*”不应该翻译成“间接访问运算符”,最好译成就“指针运算符”或也可以叫地址运算符,“*”本质作用是把它后面的数据当做地址来对待而不是运算数据,就像x86中地址用“[]”标定(如[0x10000]);这样上面两句就好理解了,*p=1是把后面的变量P作为地址处理,变量p值是0x10000,所以0x10000被赋值1;*(int *)0x11111=1是把常量0x11111作为地址,所以0x11111被赋值1。这样就不会混淆了!

下面再来看看这个语句:(int *)0x11111=1;这个语句好像是把1赋值给了存储单元0x11111,理由是0x11111被强制转换为了指针,指针本质就是地址,那么,这句话把数据1赋值给存储单元0x11111是理所当然的了;可事实并非如此,在turbo c2.0编译时编译器会报错:lvalue required in function main,好像是提示需要一个左值。明明是被转换为了指针(地址),怎么不能对其赋值呢?原因就是指针型数据扮演着地址和普通数据的双重身份,不仅可以当做地址去访问,还能像普通的数据一样,可以进行运算,(int *) 0x11111=1;虽然把0x11111转换成了指针类型的数据,但是在(int *) 0x11111=1;中没有表明要把0x11111当做地址来看待,所以编译器把它当做一个常数,导致错误;如果这样写:*(int *)0x11111;,前面加了个地址运算符就是表明把0x11111当做地址来访问,就达到预期效果了。

相关帖子

沙发
highgear| | 2011-8-29 21:41 | 只看该作者
间接访问运算符 应该源自于 间接寻址,“间接访问”这个词应该是为懂汇编的人准备的。

术语定义是约定俗成,如果硬扣字眼,就会陷入魔道。例如“电脑”,即便“指针”,从字面上硬推也是不妥,指也就罢了,跟针有什么关系?

使用特权

评论回复
板凳
不光写程序|  楼主 | 2011-8-30 09:02 | 只看该作者
2# highgear

不是你这么说的,专业术语应该给人带来方便实用,不是说不能叫那个,只是能有更好的叫法,如果给人照成麻烦就不怎么合理了。那为什么不弄个更好点的呢?

使用特权

评论回复
地板
不光写程序|  楼主 | 2011-8-30 09:08 | 只看该作者
本帖最后由 不光写程序 于 2011-8-30 09:14 编辑

2# highgear

况且你的这就话“间接访问运算符 应该源自于 间接寻址”也不对。看看这句:*(int *)0x10000=100; ,哪里有间接寻址:L ?明明就是个直接寻址。

有理由相信“间接访问运算符 应该源自于 间接寻址”这个理解正是“间接访问运算符”这个名字给您带来的困惑!

使用特权

评论回复
5
qin552011373| | 2011-8-30 11:04 | 只看该作者
好好看看指针这一部分

使用特权

评论回复
6
程序医人| | 2011-8-30 18:42 | 只看该作者
没人发表见解吗?

使用特权

评论回复
7
highgear| | 2011-8-30 21:06 | 只看该作者
间接访问运算符 的定义:
The indirection operator (*) accesses a value indirectly, through a pointer. The operand must be a pointer value. The result of the operation is the value addressed by the operand; that is, the value at the address to which its operand points. The type of the result is the type that the operand addresses.

* 是通过指针的间接存取一个值。

使用特权

评论回复
8
不光写程序|  楼主 | 2011-8-31 08:35 | 只看该作者
这个洋文也不能说明问题啊,关键还是要看事实的吧?

使用特权

评论回复
9
不光写程序|  楼主 | 2011-9-12 15:40 | 只看该作者
十来天不上也没人发表哥意见?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

24

主题

950

帖子

2

粉丝