深入理解指针(2)

目录

4.const修饰指针

4.1const修饰变量

5.指针运算

5.1指针+-整数

5.2指针-指针

5.3指针的关系运算

6.assert断言




4.const修饰指针

4.1const修饰变量

在编程中,为了防止代码在运行过程中变量的内容意外改变,可以使用const函数,对变量进行限制,使变量处于不可直接被修改的状态。

比如:

a764d960a3274491a8a7c6a586e68dee.png

被const修饰后的b,是无法通过b进行直接修改的,但是如果我们换种方法呢?

b79b5427d4a849668b4a6b55ef200546.png

可以发现,即使通过 b 无法直接实现内容的更改,但如果我们将b的地址取出来,通过地址更改b的内容,还是可以做到的

那如果我们也不想通过地址更改b的内容呢?比如:

5f7a35070fe047678d000866f9362b3a.png

在这里,我们通过const 限制 *pb,就无法通过*pb 更改 pb所指向地址的内容

这里限制的是*pb,但是pb是不受任何影响的,比如:

4cc1b168d5cc43189c8ca1059c57bd29.png

我们仍旧可以使用pb,令 pb = a 的地址,最后解引用pb所指向的地址,输出a的值

注意:这里只是无法通过*pb 更改 pb所指向地址的内容,并不是说明*pb无法使用,比如:

964e0c0540c14f0b9eb4e472002b9731.png

如果我们只想限制 pb ,那就如左图        如果我们 pb 与 *pb 都想限制,那就如右图

0dc4a2f446a54c4ea13b750afcedc118.png7563fe628d624ad0b5abc5a619343dde.png

结论:const修饰指针变量的时候

(1)const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容可变

(2)const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针所指向的内容,可以通过指针改变


5.指针运算

指针的基本运算有三种,分别是:

指针+-整数

指针-指针

指针的关系运算


5.1指针+-整数

2a547a364a5740cf98ff4973198b03a0.png

备注:数组名代表首元素地址

指针+-整数会跳过 整数*sizeof(类型)个字节,上一张章作品有详细讲解


5.2指针-指针

指针-指针会返回一个整数,返回的这个整数的绝对值是两个地址之间的元素个数

比如:

285406f80b1b42f4abff9f55a2cb397c.png


5.3指针的关系运算

指针之间也是有大小的,因此也可以通过指针来实现循环

3d15155c25fb44119944b1baca161fb0.png


6.assert断言

在C语言中有一种函数,用于在运行时确保程序符合指定条件,如果不符合,就报错终止运动,它也常常被称为“断言”

这个函数就是assert函数

assert( )接受一个表达式作为参数。如果该表达式为真(返回值非零),assert( )不会产生任何作用,程序继续运行。

如果该表达式为假(返回值为零),assert( )就会报错,在标准错误流 stderr 中写入一条错误信息,显示没有通过的表达式,以及包含这个表达式的文件名和行号。

在使用assert函数时,我们要包含一个头文件 <assert.h>

使用如下:

74b4459d38d5407f879f1b4e4141db22.pngf888a15b2a9a49c39109d09a9e7f57c2.png

由此可见assert的作用

当我们写了几百行代码时,assert就可以起到很大的作用,同时assert对于程序员是非常友好的,当我们利用assert确定程序完全没有问题之后,我们就可以在头文件之前定义一个NDEBUG,

这样所有的assert就会被注释掉,提高代码运行效率

当我们出错误时,把NDEBUG去掉,就可以再次使用assert了

92c86f7e153d4471ae039ed9e163401c.png

由此可见,利用完NDEBUG后,a不等于10代码也可以正常进行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值