一、指针函数
函数的返回值为指针的函数;
注意:不能返回局部变量的地址;
可以返回静态变量的地址;
可以返回全局变量的地址;
1、动态内存分配
void *malloc(size_t size); //申请空间的函数
void free(*ptr); //销毁申请的空间
【malloc】:在申请到的地址在内存空间上是连续的;申请的地址是没有被初始化的;
使用时包含头文件【#include <stdlib.h>】
如果没有申请到地址的话返回为【NULL】;
接收首地址的指针,若要变化,将指针备份;
free释放后,将指针置为空,避免野指针出现;
eg:(1)申请一个空间,将数组s中元素拷贝在申请的空间中 输出后销毁空间;
程序:
(2)将数组s和t拷贝在新开辟的空间中;
程序:
2 、realloc函数
void *realloc(void *ptr, size_t size);
- 重新开一段空间,将原来内容拷贝,并释放原来的内容;
- 用于扩容或缩容
- 主程序结束时,垃圾回收器会回收未释放的指针,但仅适用于有操作系统,不适用于裸机程序
3、 calloc函数
void *calloc (size_t nmemb,size_t size)
//int *p = malloc(10 * sizeof(int));
int *p = calloc(10, sizeof(int));
4、 reallocarray函数
void *reallocarray(void *base, size_t nmemb, size_t size)
二、 函数指针
2.1 语法
首先,写函数声明,去掉函数名,在去掉的位置加(*p)
如: int (*p)(int ,int) // 此时p指向一类两个整形作为参数且返回值为基类型的指针
函数的函数名为该函数的入口地址
2.2 作用
降低程序的耦合性
eg:
(1) 采用回调函数,打印出可以被三整除的数
qsort函数也使用了回调函数,其一般形式为:
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
eg:
(2)快速排序浮点型的数组;
程序:
三、 指针数组
int *a[10];//定义了十个指针
作用:
int main(int argc, char *argv[])
{
return 0;
}
eg:
(1)找出字符串中的最大值;
程序:
四、 指针指针
称为二级指针
函数实参是一个指针数组,形参是指针的指针
eg:
(1)数组的遍历;
程序:
(2)逆序输出
程序:
第二种,用swap交换;
(3)数组的排序:
程序:
(5)二分查找法进行查找;
五、练习
编写程序实现单词的倒置 "how are you" -> "you are how"