这样还弄不死指针?
厘清”指针是什么“这件事
什么是整型变量?我认为可以说成是接收整型数据的变量。这样就可以得到指针变量的定义——
接收指针(地址)的变量——指针就是地址,这和指针变量是两回事!!指针是个(带箭头的)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未初始化“。
指针变量初始化,是很好理解的,就是获得一个合法的内存地址。注意,地址虽然是由
编译器随机分配的,但是初始化时分配的内存一定是合法的(否则干嘛提示”未初始化“)。
而指针初始化,就是对其指向的内存单元写数据,但这段内存单元让不让你写呢?这里就有很多问题了。
指针初始化
如果我们没有对指针初始化,编译器当然会做这件事。只是做得可是不近人情啊,它会随便给个地址,
至于这个地址是不是可以访问它就不管了。这就好比它指给你个座位,可上面坐着
一个2米02的俄罗斯大汉,人家会让你坐吗?
如果没有初始化指针,编译会随意分配地址,总得来说有3种情况:
1、指向NULL (0x0...),也就是空指针。 (至少是安全的)
2、指向合法地址。 (运气真好,不过隐患最大)
3、指向非法地址,也可叫野指针。 (可能要悲催啦)
对于空指针,它指向的内存地址是肯定不能访问的,所以是安全的。
第二种现象几乎不会发生,即使碰上了,但还是无法保证其后续内存单元是可以读写的。
第三种情况是很麻烦的,如果它保存了系统或应用程序代码,并可写的话,后果是很严重的。但如果在PC上
开发时,还是可以把心放到肚子里的,因为操作系统肯定会down掉这段代码。如果是做嵌入式开发,特别
是在单片机上的时候,这种现象就只能靠用户自己去避免啦。
上面的东西都好理解,但是只有用的多了熟练了,才能做到避免错误。指针有很多应用,比如链表、
队列、栈以及用链表表示文本来处理文本等,这些东西都弄通了,指针当然也就不神秘啦。