指针之那些你没注意的知识点

指针之那些你没注意的知识点 序言本篇为个人学习笔记无参考价值纯属为了个人记忆1.int const *p与int *const p的区别前者限制了指针所值向的变量不能变可以改变指向变量的值但无法改变指向的变量#includestdio.h int main(){ int a10; int b0; int * const pa; *p9; printf(%d,a); return 0; }而后者限制了指针指向变量的值但可以改变指向的变量2.野指针野指针 指向“垃圾地址/无效地址”的指针不是 NULL也不是你合法申请的内存​。指向不知道哪块内存- 一读写就会程序崩溃、乱输出、卡死野指针常见的来源指针未初始化int *p; // 没有赋值就是野指针 *p 10; // 直接崩指针指向的内存已被释放int *p malloc(sizeof(int)); free(p); // 释放后 p 变成野指针 *p 10; // 崩指针越界访问int arr[5]; int *p arr[0]; p 10; // 超出数组范围 → 野指针 *p 10; // 崩3.assert断言介绍assert是一个“检查条件是否成立的工具”条件不成立就直接报错终止程序用来快速发现bug使用时包含头文件#includeassert.h代码示例#includestdio.h #includeassert.h int main(){ int a0; assert(a0);//成立正常运行 assert(a0);//不成立程序报错退出 return 0; }具体应用检查不该出错的地方是否出错检查指针不为空检查参数合法检查数组下标不越界示例void fun(int *p){ //确保p不是空指针 assert(p!NULL); *p100; }void set_score(int score){ //检查参数是否合法 assert(score0score100); }发布时assert如何关掉在#includeassert.h前面定义#defineNDEBUG。#define NDBUG #includessert.h4.sizeof(数组名)与数组名