首页 > 其他 > 详细

关于指针的一点体会

时间:2014-04-12 06:10:51      阅读:461      评论:0      收藏:0      [点我收藏+]

   首先,以一个程序作为开始。

/*程序1*/
#include<stdio.h>
int i;
int main()
{
    int *p, * q, *r, *s;
    printf("指针p的值 :%p\n", p);
    printf("指针q的值 :%p\n", q);
    printf("指针r的值 :%p\n", r);
    printf("指针s的值 :%p\n", s);
    printf("指针p指向的内存单元的内容 :%d\n", *p);
    return 0;
}

   在ubuntu 12.04环境下编译、运行结果如图1:

bubuko.com,布布扣

图1 程序1ubuntu上运行结果

   从图1的运行结果来看,未初始化的指针是可以读取其值的,这说明未初始化的指针是有值的,只不过我们无法预测,但也可能是没有值的,就如指针q的值是nil(nil表示无值)。对于有值的并且未初始化的指针,我们可以读取该指针指向的内存单元的内容,这个内容也是无法预测的。读取未初始化的指针的值是没有意义的,因为我们不知道它会是什么值,但这种操作在程序运行过程中会产生意想不到的错误。

   在windows xp环境下编译、运行结果如图2:

bubuko.com,布布扣

图2 程序1在windows上运行结果

   从图2的运行结果来看,我们发现未初始化的指针的值都是0xCCCCCCCC,这是因为在VC++中,程序在debug模式下,未初始化的指针自动初始化为0xCCCCCCCC,而0xCCCCCCCC是程序不能访问的地址,访问时会触发异常(参考http://xingyunbaijunwei.blog.163.com/blog/static/76538067201281793111474/)。


   现在我们来看另一个程序,代码如下:

/*程序2*/
#include<stdio.h>
int main()
{
    int *p;
    printf("准备给*p赋值\n");
    *p = 2;
    printf("完成赋值\n");
    return 0;
}

   在ubuntu上的运行结果如图3所示。

bubuko.com,布布扣

图3 程序2在ubuntu上运行结果

从图3的运行结果来看,没有成功给指针p指向的内存单元内容赋值,对未初始化的指针指向的内存单元进行写操作也是不允许的,因为对未知内存进行写操作是很有可能破坏系统的。

   其实,这些看是简单的知识细节,在编程时如不注意,会操造成一些无法预测的错误,比如在指针用作参数进行传递时,得不到预期的结果,尤其是新手或者对指针了解不深的程序员。另外,在C语言里,全局变量(包括静态的)和局部静态变量的默认值是0,而局部非静态变量是没有默认值的,它的值是未知的。


关于指针的一点体会,布布扣,bubuko.com

关于指针的一点体会

原文:http://slientradio.blog.51cto.com/7241495/1393933

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!