这样还弄不死指针?

厘清”指针是什么“这件事

什么是整型变量?我认为可以说成是接收整型数据的变量。这样就可以得到指针变量的定义——

接收指针(地址)的变量——指针就是地址,这和指针变量是两回事!!指针是个(带箭头的)16进制的数,

而指针变量就是盛放这个数的容器。还不能理解?换句话说,地址可以看成是特殊点的数据类型,和

整型、字符、浮点等一个地位。但是地址这厮为了弄出神秘感来,硬是给自己扣了个头衔——指针。

其实,一个指针变量携带的信息不只是一个地址而已,还有要分配的内存大小。变量的指针(地址)属性是

由指针符号 '*' 标识的,而内存大小是由指针变量类型标识的。

 

指针变量初始化

先看两段代码:

1 int a = 10;                                int a = 10; 
2 int *p;                                    int *p;
3 p = &a;   //指针变量初始化                   *p = a;
4 *p = a;   //指针初始化                       p = &a;

哪边的代码能执行呢?


在我的测试(linux/GCC)中,右边的代码肯定会出现”段错误”和“p未初始化“。

指针变量初始化,是很好理解的,就是获得一个合法的内存地址。注意,地址虽然是由

编译器随机分配的,但是初始化时分配的内存一定是合法的(否则干嘛提示”未初始化“)

而指针初始化,就是对其指向的内存单元写数据,但这段内存单元让不让你写呢?这里就有很多问题了。


指针初始化

如果我们没有对指针初始化,编译器当然会做这件事。只是做得可是不近人情啊,它会随便给个地址,

至于这个地址是不是可以访问它就不管了。这就好比它指给你个座位,可上面坐着

一个202的俄罗斯大汉,人家会让你坐吗?

 

如果没有初始化指针,编译会随意分配地址,总得来说有3种情况:

1、指向NULL (0x0...),也就是空指针。 (至少是安全的)

2、指向合法地址。 (运气真好,不过隐患最大)

3、指向非法地址,也可叫野指针。 (可能要悲催啦)

 

对于空指针,它指向的内存地址是肯定不能访问的,所以是安全的。

第二种现象几乎不会发生,即使碰上了,但还是无法保证其后续内存单元是可以读写的。

第三种情况是很麻烦的,如果它保存了系统或应用程序代码,并可写的话,后果是很严重的。但如果在PC

开发时,还是可以把心放到肚子里的,因为操作系统肯定会down掉这段代码。如果是做嵌入式开发,特别

是在单片机上的时候,这种现象就只能靠用户自己去避免啦。

 

上面的东西都好理解,但是只有用的多了熟练了,才能做到避免错误。指针有很多应用,比如链表、

队列、栈以及用链表表示文本来处理文本等,这些东西都弄通了,指针当然也就不神秘啦。

 

posted @ 2012-09-27 19:48  陈小硕  阅读(1318)  评论(10编辑  收藏  举报