深入理解指针(2)

续前言


目录

四、 const修饰指针

(1)const修饰变量

(2)const修饰指针变量

五、 指针运算

(1)指针+-整数——打印数组的每个元素

(2)指针-指针

(3)指针关系运算

六、 野指针

(1)野指针成因和规避

七、 assert断言

(1)strlen优化

八、指针的使用和传址调用

(1)交换两个数

(2)两个值相加


四、const修饰指针

4.1 const修饰变量

被const修饰的变量称为常变量

num本身是变量,变量是可更改的值,当不希望num值被随意改动时,前面加const修饰

const修饰后具有常量属性,在语法上不允许改动

4.2 const修饰指针变量

const 修饰指针有两种情况
(1)const放在*前面;例如: const int* p 或  int const* p
 表示:指针变量p本身可以改变,但指针变量指向的内容不可变


(2)const放在*后面 int* const p
 表示:指针变量p本身不可改变,指针变量所指向的内容可变

(3)若*前后都加const修饰则不可改变任意值

五、指针运算

5.1 指针+-整数

在往常我们经常使用下标访问的方式来打印数组的每一个元素,如下图:

其实也可以通过传数组的地址,用指针加减整数的形式来打印每一个元素,如下图:

pa指向数组首元素地址,+i 表示找到数组中第i个元素的地址,再解引用则打印元素

5.2 指针-指针

(1)指针是用来存放地址的,指针-指针 == 地址-地址;(2)必须是指向同一块空间的地址才能相减;(3)相减的值是两者间的元素个数

通过模拟实现strlen来演示:

strlen的计算原理是计算'\0'之前的元素个数,用指针-指针的方式实现得有两个指针变量;

一个指向首元素,另一个指向'\0'的位置;两者相减为元素个数

5.3 指针关系运行

指针关系运算和比较关系有关,就是><==

六、野指针的成因和规避

(1)指针未初始化

(2)指针越界访问

(3)指针指向的空间被释放

规避:指针变量不再使⽤时,及时置NULL,指针使⽤之前检查有效性;指针初始化;不可返回局部变量地址

七、assert断言

assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报
错终⽌运⾏。这个宏常常被称为“断言”。
assert() 的使⽤对程序员是⾮常友好的,使⽤ assert() 有⼏个好处:它不仅能⾃动标识⽂件和
出问题的⾏号,还有⼀种⽆需更改代码就能开启或关闭 assert() 的机制。如果已经确认程序没有问
题,不需要再做断⾔,就在 #include <assert.h> 语句的前⾯,定义⼀个宏 NDEBUG
assert() 的缺点是:因为引⼊了额外的检查,增加了程序的运⾏时间。
strlen的优化
求字符串长度不会对字符串本身做修改所以加const修饰;
是指针就先判断是否为空指针,避免传递空指针

八、指针使用和传址调用

(1)交换两个数需要改变原有值,用传址

(2)计算两个数的和不会改变原始值,用传值

形参是实参的一份临时拷贝,更改形参并不会影响实参;朋友们要根据自己的需求判断什么时候传址合适。


卖命加载中........

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值