零基础C语言学习日志13(深入理解指针(2))

目录

 

const修饰指针

const修饰变量

const修饰指针变量

野指针

野指针的成因

指针未初始化

指针越界访问

指针指向的空间释放

如何规避野指针

assert断言

指针的使用和传址调用

strlen的模拟实现

传值调用和传址调用


 

const修饰指针

const修饰变量

变量是可以被修改的,如果把变量的地址给一个指针变量,通过指针变量也可以修改这个变量。但是如果我们想要一些变量不能被修改,该怎么办呢?

这就需要const修饰了。

但如果硬要修改也有办法,可以通过地址修改。

const修饰指针变量

但这改变了我们不想变量被修改的初心,那该怎么办呢?既然这样,我们直接让const修饰指针变量就可以了。

        

但是这里的const放在 * 的左边和右边也有区别。

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

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

野指针

概念: 野指针就是指针指向的位置是不可知的。(随机的、不正确的、没有明确限制的)

野指针的成因

指针未初始化

指针越界访问

指针指向的空间释放

如何规避野指针

指针初始化

小心指针越界

指针变量不再使用时,及时置NULL,指针使用前检查其有效性(p = NULL;)

避免返回局部变量的地址

assert断言

assert.h 头文件 定义了宏 assert(表达式) ,用于在运行时确保程序符合指定条件,如果不符合,就报
错终止运行。这个宏常常被称为“断言”。

assert() 的使用对程序员是非常友好的,使用 assert()有几个好处:它不仅能自动标识文件和出问题的行号,还有一种无需更改代码就能开启或关闭 assert()的机制。如果已经确认程序没有问题,不需要再做断言,就在 #include<assert.h>语句的前面,定义一个宏 NDEBUG。

assert()的缺点是,因为引入了额外的检查,增加了程序的运行时间。一般我们可以在 Debug 中使用,在 Release 版本中选择禁用 assert 就行,在 VS 这样的集成开发环境中,在 Release 版本中,直接就是优化掉了。这样在debug版本写有利于程序员排查问题,在 Release 版本不影响用户使用时程序的效率。

指针的使用和传址调用

strlen的模拟实现

传值调用和传址调用

传值调用

传址调用

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值