void*
无具体类型的指针
这种指针可以用来接受任意类型的地址。
但有局限性,void* 类型的指针不能直接进行指针的 + - 整数和解引用的运算
当传输地址不确定时,使用 void*
const修饰变量
const int a = 10;
a = 20;//报错,(修改不了)
int arr[a]//报错,(a为变量)
C语言:虽然 const 修改变量使 a 变量具有了常属性,但本质仍然是变量
但我们可以通过指针讲 a 的内容进行更改
const修饰指针变量
由于const修饰了变量a,使a在明面上更改不了。但暗地里可以通过指针变量继续更改a的内容
为了弥补这个缺陷,我们可以在指针变量 ‘ * ’ 符号前后加const
书写:int const * const p = &a;
后const 修饰 p 本身,也就是p 的内容不能更改
(p = &b;报错)
前const 修饰*p, 也就是 *p (a)的内容不能更改
(*p = 20;报错)
指针运算
• 指针 + - 整数
• 指针 - 指针
指针 - 指针 类似 日期 - 日期
日期 - 日期 获得值的绝对值是两者相差的天数
指针 - 指针 获得值的绝对值是两者相差的元素个数
没有日期 + 日期 ,也没有指针 + 指针
且指针 - 指针有前提:两指针处于同一空间
int arr [10]中的地址 - char ch[5]的地址就绝对不行
• 指针的关系运算
指针与指针比大小 (常用于表达式判定)
野指针
指向的位置不可知的指针就被称为野指针
原因:1.指针未初始化
int* p; 类似整形变量未给值,指针变量未给地址
2.越界访问
3.指针指向的空间释放
int* ret()
{
int a = 10;
return &a;
}
int main()
{
int* p = ret()
}
如何规避野指针
1.指针初始化,明确指针指向类型;不明确者,指向NULL( NULL = (void*)0 )
2.指针不再使用时,及时指向NULL;指针使用前检查有效性
3.不要返回局部变量的地址
assert 断言
头文件:assert.h
使用:assert( p != NULL )
验证 p 是否为NULL,为真继续执行后续代码;为假,终止运行,并且给出报错信息
不需要断言时
在头文件前定义:NDEBUG
#define NDEBUG
传值调用和传址调用
将一个整形变量书写在函数中
a 为传值调用
&a 为传址调用