指针概述和使用注意事项

一、指针是什么(地址形象化)

二、多级指针

三、野指针

四、内存分配方式

        malloc、calloc 、realloc 和free

概述

一、指针是什么

1、指针是一种数据类型,可以定义变量,保存的内容是地址

2、指针的作用

        指针保存的是地址,通过指针变量可以操作地址,即可直接操作寄存器地址,从而实现直接访问硬件,这是C语言与其他语言最大的不同。

3、指针的大小

        因为地址是固定的长度,所以指针变量的长度也是固定的,系统位数的决定指针变量的字节长度,64位系统地址指针变量长度为8字节,32位系统指针变量长度为4字节

4、为什么指针的字节长度固定了还要定义不同的类型

        因为指针的地址属性———步长(做加1操作所移动的字节数),不同类型的指针变量保存不同步长的地址。

地址+操作数=地址

5、直接访问和间接访问

        变量内保存内容,指针通过保存变量的首地址来间接访问变量的内容

6、*和&

        * 指针标识符 间接运算符        & 取地址符   

*p=a   =》p=&a               相当于逆运算,&是内容向外取地址,*是地址向内取内容

7、指针的定义方式

int a;int * p=&a;

=》int a;int*p;p1=&a

8、指针阅读——右左法则

int*p

        p  左右没有()[] 所以是一个变量    *表示指针标识符,说明保存的是地址,这个变量是指针变量, int说明是一个整形的指针变量

9、指针的偏移

        p++    p中保存的是变量地址,++表示变量地址加1个步长,表示变量的下一个内容

     (*p)++     *p是指针里的内容,++ 表示字节地址里的内容加1,加一个字节

指针概述和使用注意事项_第1张图片

指针概述和使用注意事项_第2张图片

指针概述和使用注意事项_第3张图片

二、多级指针

1、多级指针的作用

        保存上一级指针的地址,应用在函数的传参

注意:1、相同类型指针之间才可以赋值

           2、void* 万能指针,用来接受任意类型的值 (不知道返回值的情况下),但不能直接打印内容,步长为1

           3、指针的加减,可以减不能加   指针+指针 返回error   指针减指针   返回两个地址数据的个数(指针类型相同)

三、野指针

1、什么是野指针

指针变量里保存的地址对应空间无访问权限(指针所指向的地址空间无访问权限)

2、野指针的出现

1.定义后未初始化的指针;2、释放结束之后的指针;3、越界访问的指针(指向分配空间之后的指针)

3、野指针出现产生的问题

内存泄露,运行时错误,内存错误(段错误)

4、如何避免野指针

编码习惯

1、定义变量时必须初始化

     1.当指针变量作为指向工具时,定义初始化NULL;

     2.当指针变量指向的空间赋值时,需要动态申请空间

2、使用时

     1.检查内存空间是否分配成功

     2.初始化内存空间(清零内存)

     3.防止越界访问

3、使用结束

     1.必须释放空间

     2.释放解释一定将指针再次置为NULL

NULL什么鬼?

简单理解0,但不等于0,NULL用于指针和对象,0用于数值,因为NULL大多数情况下指向0,所以#defined NULL 0;但并不是说NULL=0

四、内存空间分配

1、分配方式

     静态方式:开销小,但是空间利用率不高,系统分配

     动态分配:开销大,提高空间利用率,在堆空间上开辟空间,用户分配

        malloc         calloc         realloc        free

1、 malloc

        malloc只开辟空间,不进行类型检查,返回一个无类型指针,必须加强制类型转换
指针自身 = (指针类型*)malloc(sizeof(指针类型)*数据数量)

    int *p = NULL;
    int n = 10;
    p = (int *)malloc (sizeof(int) * n);

   长度:sizeof(类型)*数量

 如果多次申请空间那么系统是如何做到空间的不重复使用呢?
        在使用malloc开辟一段空间之后,系统会在这段空间之前做一个标记(0或1),当malloc函数开辟空间如果遇到标记为0就在此开辟,如果为1说明此空间正在被使用

2、calloc        

         开辟空间时,对空间进行初始化

用法:void*calloc(元素的数目,每个元素的大小)

调用成功后,malloc和calloc都返回分配空间的首地址

3、realloc 

        更改已配置空间的内存大小

用法:realloc(更改指针名,更改成的大小)

使内存减小:直接减,如果原来的空间位置内容未被修改,依旧可以打印原来的数

使内存增大

1、当前内存段后有足够的内存空间大小,直接扩展,realloc()将返回原指针

2、当前内存后的空间不够,就使用堆中第一个满足要求的内存块,将目前数据复制到新的位置,并将原来的数据块释放掉,放回新的内存块位置

3、如果申请失败,讲返回NULL,此时,原来指针依旧有效


4、free

        释放malloc calloc、realloc函数给指针变量分配的内存空间

注意:1、使用时添加函数库#include
           2、在堆空间开辟内存

你可能感兴趣的:(C语言基础,c语言)