本文为原创,欢迎转发:

欢迎关注微博与微信号:C语言编程技术分享

C语言中,指针的概念有点难懂,使用起来稍微不注意,也会遇到各种问题。在本文中,我列举出了几个使用指针不当的方式,希望朋友们在编程实践中也多多注意。

一、野指针

野指针这个东东是经常被人提及的,其危害也是大家有目共睹的。我很早之前写过一篇文章来说明野指针的,链接是:

C程序中可怕的野指针 - 知乎专栏

有兴趣的朋友可以看看,这里就不多废话了!

二、越界访问

越界访问最常见的就是使用指针访问数组元素了。比如下面这段代码:

#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,逐个访问数组的每个元素,并打印出来。

当index为3的时候,p + index此时就越出数组的长度了,那么*(p + index)访问的就是数组以外的内容,输出啥呢?看下面的输出结果:

最后一个数字,是2293468,这是数组以外的元素。

本例中还好,对数组以外的内容只是读取一下而已,如果是写操作的话,会发生什么,看你的人品了!

三、指针不可相加

两个指针相加,你见过吗?相乘呢?看下面的代码:

#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型元素。有兴趣的朋友可以改下代码看看。

四、多个指针指向同一个常量区域

先上代码:

#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都指向它,这样设计可以节约存储空间。

五、小心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中,原意是希望通过“sizeof(number) / sizeof(number[0])”来计算出数组的大小,来一个一个输出数组的元素。可实际上呢,根本不是。运行结果如下:

结果只输出了一个元素。

函数print的形参number虽然写的是数组的形式,但是实际上它是一个指针,

sizeof(number) 计算的是指针本身占用的字节数,为4;

sizeof(number[0])计算的是int整型变量占用的字节数,也为4;

因此for循环只循环了一次就结束了。

我曾经也写过一篇文章,来讲解sizeof(数组)和sizeof(指针)的区别,有兴趣的朋友可以看看:

别混淆了sizeof(数组名)和sizeof(指针) - 知乎专栏

最新文章

  1. Linux哲学思想--基本法则
  2. ES5新语法forEach和map及封装原理
  3. 解析html并使用canvas进行渲染
  4. PAT (BL) 1001
  5. blocked file type by sharepoint 分类: Sharepoint 2015-07-05 07:45 6人阅读 评论(0) 收藏
  6. 微软DbHelper
  7. c# 利用 两个TREEVIEW控件完成TEENODE的鼠标拖动操作
  8. iOS开发--动画篇之layout动画深入
  9. Servlet的延迟加载和预加载
  10. [iOS基础控件 - 6.10.7] UIWindow
  11. ubuntu出现有线已连接却无法上网
  12. db2导入表结构和表数据
  13. lesson - 1 笔记 网络连接 /putty 密钥登陆
  14. java 包命名规范
  15. android横竖屏切换activity生命周期变化
  16. Spring学习之旅(二)极速创建Spring框架java Web工程项目
  17. Mac上svn报错解决方案
  18. Linux下实现ssh免密认证
  19. math模块
  20. 高通QMI协议

热门文章

  1. SQLServer 不允许保存更改的解决办法
  2. WPF 的DynamicResource的NewLine问题
  3. 什么是BSON?
  4. 命令行程序如何获取HINSTANCE?
  5. 程序员该如何过好他的整个职业生涯?(最重要的是你得一直往前走。拐点不是你的工资。想起很久前有个人说我“逻辑性”比较强)good
  6. Qt 5 最小构建笔记(只编译QtBase)
  7. 如何解析DELPHI XE5服务器返回的JSON数据(翻译)及中文乱码
  8. c# 叫号小程序
  9. C#爬虫与反爬虫--字体加密篇
  10. 原子操作CAS-最小的线程安全