本文为原创,欢迎转发:编程
欢迎关注微博与微信号:C语言编程技术分享数组
C语言中,指针的概念有点难懂,使用起来稍微不注意,也会遇到各类问题。在本文中,我列举出了几个使用指针不当的方式,但愿朋友们在编程实践中也多多注意。微信
1、野指针
函数
野指针这个东东是常常被人说起的,其危害也是你们有目共睹的。我很早以前写过一篇文章来讲明野指针的,连接是:spa
有兴趣的朋友能够看看,这里就很少废话了!指针
2、越界访问code
越界访问最多见的就是使用指针访问数组元素了。好比下面这段代码:blog
#include <stdio.h> int main(void) { int number[3] = {1, 2, 3}; int *p = NULL; p = number; for(int index = 0;index < 4; index++) { printf("%d\n", *(p + index)); } return 0; }
代码很好理解,就是用一个指针p,逐个访问数组的每一个元素,并打印出来。ip
当index为3的时候,p + index此时就越出数组的长度了,那么*(p + index)访问的就是数组之外的内容,输出啥呢?看下面的输出结果:
最后一个数字,是2293468,这是数组之外的元素。
本例中还好,对数组之外的内容只是读取一下而已,若是是写操做的话,会发生什么,看你的人品了!
3、指针不可相加
两个指针相加,你见过吗?相乘呢?看下面的代码:
#include <stdio.h> int main(void) { int number[3] = {1, 2, 3}; int *p = NULL, *q = NULL; p = number; q = &number[2]; printf("%d\n", p + q); return 0; }
先不去管这个错误,咱们能够本身想一想,两个指针相加,有什么意义呢?指针的值,也是一个数字,只不过这个数字是别人的一个地址,两个指针相加,就是两个地址值相加,确实没啥意义!
可是若是两个指针相减呢?如代码中指针q减去指针p,这个就是有意义了,意义就在于两个指针相隔几个int型元素。有兴趣的朋友能够改下代码看看。
4、多个指针指向同一个常量区域
先上代码:
#include <stdio.h> int main(void) { const char *p = "12345"; const char *q = "12345"; const char *r = "123456"; printf("%d\n", (p == q)); printf("%d\n", (p == r)); return 0; }
从结果中能够看到,指针p与q的值是同样的,也就是说,指针p与指针q是指向同一个字符串“12345”,而指针p与指针r就各自指向各自的字符串了。
对于常量字符串“12345”而言,在程序期间,只有本身这一个实体,没有其它的拷贝,指针p和指针q都指向它,这样设计能够节约存储空间。
5、当心sizeof(指针)的用法
关于sizeof(指针),计算的是指针变量自己占用的字节数,认识不到这一点,就会闹出笑话,好比下面的程序:
#include <stdio.h> void print(int number[]) { for(int index = 0;index < sizeof(number) / sizeof(number[0]); index++) { printf("%d\n", number[index]); } } int main(void) { int number[3] = {1, 2, 3}; int *p = NULL; p = number; print(p); return 0; }
结果只输出了一个元素。
函数print的形参number虽然写的是数组的形式,可是实际上它是一个指针,
sizeof(number) 计算的是指针自己占用的字节数,为4;
sizeof(number[0])计算的是int整型变量占用的字节数,也为4;
所以for循环只循环了一次就结束了。
我曾经也写过一篇文章,来说解sizeof(数组)和sizeof(指针)的区别,有兴趣的朋友能够看看: