C语言的学习(十六)---堆空间、函数指针
本文摘要: 堆内存管理:介绍了malloc、calloc、realloc和free函数的使用方法及注意事项,强调内存申请释放必须成对出现,避免内存泄漏和野指针问题。 函数指针:讲解函数指针的定义和使用,包括回调函数的概念,并以qsort函数为例说明回调函数的实际应用。 main函数参数:说明命令行参数的获取方法,通过argc和argv参数实现程序运行时接收外部输入。 (字数:149字)
目录
一、堆
malloc //堆上
//堆空间的特点
1. 大
2. 手动申请,手动释放3. 申请 和 释放必须成对出现 (如果申请,但没释放 ---- 内存泄露)
#include <stdlib.h>
//申请空间
void *malloc(size_t size); //malloc(sizeof(int)*10)
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
void free(void *ptr); //释放空间
void *malloc(size_t size);
功能:
申请堆区空间
参数:
@size 表示申请的空间大小
单位 字节
返回值:
void * 表示 空类型 指针
成功 返回申请到的空间的首地址
失败 NULL
void *calloc(size_t nmemb, size_t size);
例如,如果要分配一个包含10个整数的数组,可以这样写:
int arr = (int) calloc(10, sizeof(int));
这样就分配了10个整数大小的内存,并且每个整数都被初始化为0。在C语言中,calloc()函数用于动态分配内存,并且会将分配的内存初始化为0。它的函数原型如下:
void *calloc(size_t num, size_t size);
//calloc()接受两个参数:
//num:表示要分配的元素个数。
//size:表示每个元素的大小(以字节为单位)。
void *realloc(void *ptr, size_t size);
//realloc(之前申请到的一块空间的地址,重新申请的空间的大小);
//realloc(NULL,sizeof(int));<==> malloc
//realloc(p,0); <==> free //释放空间
注意:
1.不要多次free同一块堆空间
2.只能释放堆区上的空间
3.free(p); //p = NULL; //防止野指针 也防止后续误操作
void * 万能指针:可以接受任意类型的地址
注意:
int a = 10;
void *p = &a;
printf("%d\n",*p); //void 表示空类型 则 最终不知道 偏移多大一块空间
如果想通过 void* 类型的指针 引用到数据
必须,强转为 ,你希望 访问的 指针类型
printf("%d\n",*(int*)p);
注意:
1.指针类型 可以作为函数的返回值类型
2.不能返回一个 局部变量(栈上)的地址 ---已经是一个被销毁了的空间
二、函数指针(返回值为指针类型的函数)
可以获得函数所在空间的地址 ---- 函数名 就是函数的入口地址
int add(int a,int b)
{
} //add函数名 ---就是函数的入口地址
定义个什么类型的指针 来存放这种地址
函数 也是有类型 --- 函数类型
int add(int a,int b); //add名字去掉 剩下就是函数类型
//int (int a,int b) //---表示这么一类函数 ,返回值为int型,同时带有两个int型 形参
地址写法:int (int a,int b) * p; //这种函数类型的指针 ---理解可以,但是不能这么写
int (*p) (int a,int b) ; //C语言标准写法
回调函数
//通过函数指针 进行 函数调用 这种就叫回调函数
//C语言是通过函数指针 实现回调例如:void processData(int a,int b, int (*pfunc)(int,int)) //pfunc就是回调函数
快速排序:
#include <stdlib.h>
void qsort(void *base, //指向要排序的数组起始地址
size_t nmemb, //要排序的元素个数
size_t size, //单个元素大小
int (*compar)(const void *, const void *) //比较规则一个 函数 --- 函数指针
);
int compar(const void *a, const void *b) //a 和 b 实际上是数组中某两个元素的地址
{
return *(int *)a - *(int *)b;
}
main函数的参数:
int main(int argc, const char *argv[])
@argc --- 表示命令行参数的个数
@argv --- 命令行参数(都是字符串)
所在的数组
例子:
用途就是在运行的时候输入参数给程序
#include <stdio.h>
//等价于char **argv
int main(int argc ,const char *argv[])
{
printf("argc = %d\n",argc);
int i =0;
while (argv[i] != NULL)
{
printf("argv[%d] = %s\n",i,argv[i]);
++i;
}
return 0;
}
更多推荐

所有评论(0)