免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷
打印 上一主题 下一主题

对C语言指针的讨论:应当如何理解、使用指针?《狂人C:程序员入门必备》有奖试读 [复制链接]

论坛徽章:
0
211 [报告]
发表于 2010-12-30 21:21 |只看该作者
把指针理解为地址,不是生硬的认为指针就是地址。K&R说指针是包含地址的变量,或者按照你的说法,指针 ...
xiaonanln 发表于 2010-12-30 18:51

我不赞成“指针是包含地址的变量”这种说法
指针是一种数据类型

论坛徽章:
0
212 [报告]
发表于 2010-12-31 08:57 |只看该作者
本帖最后由 azfa123 于 2010-12-31 09:00 编辑

int i;   //分配一份地址,地址里放什么都是合法的。i=123
int *p;//分配一份地址,地址里放什么都是合法的。p=(int *)0x12345678
          //差别:*p=20;编译器帮忙翻译了*这样的一个操作符间接寻址的操作,可以对另一个地址空间操作。
      //那很简单,你对另一个地址操作,你就要有权限,以及明白操作之后的后果。

论坛徽章:
0
213 [报告]
发表于 2010-12-31 09:19 |只看该作者
int i;   //分配一份地址,地址里放什么都是合法的。i=123
int *p;//分配一份地址,地址里放什么都是合法的。p=(int *)0x12345678
          //差别:*p=20;编译器帮忙翻译了*这样的一个操作符间接寻址的操作,可以对另一个地址空间操作。
      //那很简单,你对另一个地址操作,你就要有权限,以及明白操作之后的后果。
azfa123 发表于 2010-12-31 08:57



    什么是“地址”?
    地址是内存单元的编号
    你怎么往内存单元的编号里放东西?

论坛徽章:
0
214 [报告]
发表于 2010-12-31 10:40 |只看该作者
3.  “指针就是地址”的说法是否掩盖了指针的实质?

指针在我的理解里面应该是一块内存的索引,也许索引这个词不太准确,但是它代表的是一块内存,而不是说哪个特定的地址,如果简单的说指针就是地址确实太片面了,不能说明指针的实质。

论坛徽章:
0
215 [报告]
发表于 2010-12-31 10:50 |只看该作者
1.  一元&运算是否应该翻译成“求指针运算”而不是“求地址运算”

理解为后者“求地址运算”

如: int temp;
int * p = &temp;

这种情况,很直观的看出,这个是取temp的地址并将地址付给指针p, 对于这种,如果说是求指针运算反而会混淆,如果是求指针运算,那取的是那个指针运算,这个我支持一直以来的说法。

论坛徽章:
0
216 [报告]
发表于 2010-12-31 13:19 |只看该作者
回复 213# KBTiller


   我修改:

int i;   //分配一定的内存空间,里面里放什么都是合法的。i=123
int *p;//分配一定的内存空间,里放什么都是合法的。p=(int *)0x12345678
          //差别:*p=20;编译器帮忙翻译了*这样的一个操作符间接寻址的操作,可以把其存储的值当内存地址,进行相关操作。比如*(p-100+1+99)=20。
      //那很简单,你对别的内存空间操作,你就要有权限,以及明白操作之后的后果。

论坛徽章:
0
217 [报告]
发表于 2010-12-31 13:24 |只看该作者
3.  “指针就是地址”的说法是否掩盖了指针的实质?

指针在我的理解里面应该是一块内存的索引,也许索引 ...
magicrobot1984 发表于 2010-12-31 10:40



    这个我同意

论坛徽章:
0
218 [报告]
发表于 2010-12-31 13:25 |只看该作者
1.  一元&运算是否应该翻译成“求指针运算”而不是“求地址运算”

理解为后者“求地址运算”

如: int temp;
int * p = &temp;

这种情况,很直观的看出,这个是取temp的地址并将地址付给指针p, 对于这种,如果说是求指针运算反而会混淆,如果是求指针运算,那取的是那个指针运算,这个我支持一直以来的说法。
magicrobot1984 发表于 2010-12-31 10:50

有一点没看懂

论坛徽章:
0
219 [报告]
发表于 2010-12-31 13:29 |只看该作者
回复  KBTiller
我修改:

int i;   //分配一定的内存空间,里面里放什么都是合法的。i=123
int *p;//分配一定的内存空间,里放什么都是合法的。p=(int *)0x12345678
          //差别:*p=20;编译器帮忙翻译了*这样的一个操作符间接寻址的操作,可以把其存储的值当内存地址,进行相关操作。比如*(p-100+1+99)=20。
      //那很简单,你对别的内存空间操作,你就要有权限,以及明白操作之后的后果。
azfa123 发表于 2010-12-31 13:19

“里面里放什么都是合法的”应该怎么理解?

编译器翻译的依据恰恰就是指针的类型
因此只把指针看成地址是不全面的
事实上我们根本无法对地址进行任何操作

论坛徽章:
0
220 [报告]
发表于 2010-12-31 14:37 |只看该作者
回复 219# KBTiller

举例 x86 32位系统 vc6.0

#include <stdio.h>

int i;
int *p;

int main(int argc,char *argv[])
{       
        printf("&i=0x%p\n",&i);
        printf("&p=0x%p\n",&p);

        i = 0x12345678;                       
        p = (int *)0x12345678;
       
        return 0;
}

打印结果:
&i=0x004235BC
&p=0x004235C0

int i;编译器把从0x004235BC开始的四个字节分配给了i,你对0x004235BC开始的四个字节可读可写,说白了就是可以放0101010,0到0xffffffff随便哪个都可以仍到那四个字节里去,绝对合法!
int *p编译器把从0x004235C0开始的四个字节分配给了p,你对0x004235C0开始的四个字节可读可写,0到0xffffffff随便哪个都可以仍到那四个字节里去,绝对合法!
这有什么不可以理解的。
*p间接访问,说白了,就是编译器规定了*这个操作符用间接寻址来操。
*p可能非法访问。
int a[2],a[10000]=20;当然,你可以说不一样的非法访问,但是站在一定高度,都是一样的。

i = 0x12345678;        就是把0x004235BC 开始的四个字节分别赋值:0x78 0x56 0x34 0x12.

你说的"事实上我们根本无法对地址进行任何操作",我不知道你到底想表达什么。
i=0x12345678,只是方便我们写程序。编译器或者说操作系统才不关心i什么玩意,关心的只是从哪个地址开始多少个字节里存放什么玩意。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP