C语言第14讲

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 为传址调用