前言
前文介绍完了一些指针基本概念,下面介绍一下,const关键字、指针的运算、野指针的成因以及避免,assert函数等。
目录
const(常属性)
变量的常属性
指针的常属性
指针的运算
①指针+ -整数
②指针-指针
③指针与指针的比较
野指针的成因以及避免
①指针未初始化,就使用
②指针越界访问数组
③指针使用已释放的地址
assert(断言)函数
const(常属性)
变量的常属性
变量是可以被修改的,也可以通过将其地址交给指针变量来进行修改。如果在变量声明阶段,在变量名前加上const,那么这个变量就具有了常属性,在后面就不能进行修改了。
报错了,程序也不能正常运行。
指针的常属性
指针变量是否也能使用const来限制变量的修改呢?如果能够修改,const应该放哪呢?
在此之前先讲一讲3个容易弄混的概念(以指针变量p为例)
①p——指针变量,里面存放着一个地址
②*p——p中存放地址指向的对象
③&p——指针变量p的地址
两种情况:①const在“*”左边,限制的是*p,也就是p中存放地址指向的对象
可以看到解引用指针p时报错,但是更改p中的地址是可以的。
②const在“*”右边,限制的是p中指向的对象。
同理, 可以看到更改指针p指向地址时报错,但是更改p中的地址的对象的值是可以的。
指针的运算
指针的运算主要有以下三种:
①指针+ -整数
②指针-指针
③指针与指针的比较
①指针+ -整数
上文说到,指针类型决定了指针向前一步或向后一步“走”多大距离,数组名是一个地址常量,存放的是第一个元素的地址,那么是否能够通过加减指针完成对数组的访问呢?
②指针-指针
指针与指针的加法是无意义的。但是可通过指针与指针之间的减法完成对数组元素个数的统计。
③指针与指针的比较
野指针的成因以及避免
野指针就是指针指向位置是不可知的(随机的、不正确的、没有限制的)
成因:
①指针未初始化,就使用
②指针越界访问数组
③指针使用已释放的地址
①指针未初始化,就使用
②指针越界访问数组
因为指针越界访问数组导致打印出野指针
③指针使用已释放的地址
避免
①初始化指针,如果不知道指向哪,可以将指针赋值给NULL
②小心越界
③指针不再使用时及时置NULL,使用指针时,先检查指针的有效性
④避免返回局部变量的地址
assert(断言)函数
assert()函数包含在库函数<assert.h>中,使用时需先声明。
用法:用于确保程序满足指定条件,如果不符合,就报错终止运行
也可以在函数开始加上#define NDEBUG使文件中的assert()函数失效,在release环境中默认失效。