C语言 学习笔记 2021年11月16日

本文详细讲解了指针数组、数组指针的区别,强调了数组名与指针的关系,二级指针的作用,以及函数指针的定义与回调。深入剖析了堆内存的原理、使用场景和常见操作,包括malloc、free、calloc、realloc等函数的应用。
摘要由CSDN通过智能技术生成

指针数组与数组指针:
        指针数组:
                是由指针变量组成的数组,它的成员都是类型相同的指针变量
                int *arr[10]
        数组指针:
                专门指向数组的指针
                int (*p)[长度]
        注意:一般在使用堆内存时,可能会使用它们来定义二维数组

指针与数组名:
        数组名就是一种特殊的指针,它是常量,不能修改它的值,它与数组的内存首地址之间是映射关系,它是没有自己的存储空间
        指针变量有自己的存储空间,是可以被修改的,如果它存储的是数组的内存首地址, 那么指针变量可以当作数组一样使用,数组名也可以当作指针一样使用
                数组名[i] == *(数组名+i)
                *(指针名+I) == 指针名[i]

二级指针:
        指向指针的指针就是二级指针,里面存储的是指针变量的地址
        定义:
                类型** 指针名_pp;
        赋值
                指针名_pp = &指针变量;
        解引用:
                *指针名_pp <==> 指针变量
                **指针名_pp <==> *指针变量 <==> 普通变量
        注意:当需要共享指针变量时,就必须使用二级指针

函数指针:
        函数名就是一个地址(整数),它代表了本函数在代码段中的位置

        函数指针就是专门指向函数的指针,里面存储的是函数在代码段中的首地址
        返回值(*函数指针名p)(参数列表)

        int scanf(const char *format,...):
        重定义scanf函数指针类型:
                typedef int (*funcp)(const char*,...):
                funcp fp;        //fp是scanf函数指针变量

        回调:
                把A函数指针作为B函数的参数传递给B函数,这样做叫做函数回调

堆内存:
什么是堆内存:
        是进程的一个内存段(test,data,bss,heap,stack),由程序员手动管理
        优点:足够大        缺点:使用麻烦
为什么要使用堆内存:
        1、随着程序的复杂,数据量变多
        2、其他内存段的申请、释放不受控制,堆内存的申请、释放是受控制的
如何使用堆内存:
注意:C语言中没有能够控制堆内存的语句,只能使用c标准库中的函数来控制内存
#include<stdlib.h>

void *malloc(size_t size);
功能:从堆内存中申请size个字节的内存,申请到的内存中是什么数据不确定
size:想要申请的字节数
返回值: 成功返回申请到的内存首地址,失败返回NULL

void free(void *ptr):
功能:释放一块堆内存
ptr:想要释放的内存首地址
注意:不能释放非法地址,不能连续释放,但是空指针可以free,还可以连续free(NULL)

注意:释放的仅仅是所有权,里面的数据不会被清理

void *calloc(size_t nmemb,size_t size);
功能:从堆内存中申请nmemb块size个字节的内存,申请到的内存会被初始化为0
返回值:成功返回申请到的内存的首地址,失败返回NULL
注意:申请到时依然是一块连续的内存

void *realloc(void *ptr, size_t size);
功能:改变已有堆内存块的大小
ptr:要调整的堆内存的首地址
size:调整后的字节数
返回值:成功返回调整后的内存的首地址,失败返回NULL
注意:一定要重新接受调整后的内存首地址,有可能不是在原位置上调大调小
        如果无法在原位置调整大小:
                1、申请一块新的符合调整后大小的内存块
                2、把原内存中内容拷贝到新内存去
                3、把原内存释放掉,返回新内存块首地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值