资讯动态

【C语言】泛指针类型(Finish)

发布时间:2026/10/1 2:45:01 来源:尧图企业网站定制
引言void* 是 C 的“泛型指针”可以指向任意对象类型但不能直接解引用也不能直接做指针算术。1. malloc 返回 void*#include stdlib.h int main(void) { //析构函数内存分配 int *p malloc(sizeof *p); // C 中 void* 自动转 int* //错误防护内存边界 if (p NULL) return 1; //初始化 *p 42; // 释放堆内存free 接受 void* free(p); return 0; } //C 中不需要写 (int*)malloc(...)C 才需要强转。2. 泛型 swap用 void* 交换任意类型//预编译头文件 #include stdio.h void swap(void *a, void *b, size_t size) { //初始化无符号char型变量 unsigned char *pa a; // void* 转 unsigned char*按字节操作 unsigned char *pb b; //Swap三角换元 for (size_t i 0; i size; i) { unsigned char tmp pa[i]; pa[i] pb[i]; pb[i] tmp; } } //swap测试Demo: //2026年9月30日11:51:57 int main(void) { int x 1, y 2; swap(x, y, sizeof x); printf(%d %d\n, x, y); // 2 1 double m 1.5, n 2.5; swap(m, n, sizeof m); printf(%f %f\n, m, n); // 2.500000 1.500000 }3. qsort 比较函数const void*/* 预编译头文件、 stdio.h输入输出库函数接口文件 stdlib.h内存调用函数接口文件 */ #include stdio.h #include stdlib.h int cmp_int(const void *a, const void *b) { int x *(const int *)a; // 必须强转后解引用 int y *(const int *)b; return (x y) - (x y); } //内置排序接口 //void qsort(void *base, size_t nmemb, size_t size, // int (*compar)(const void *, const void *)); //排序Demo;2026年9月30日11:55:30 int main(void) { int arr[] {3, 1, 4, 2}; qsort(arr, 4, sizeof arr[0], cmp_int); for (int i 0; i 4; i) { printf(%d , arr[i]); } return 0; }4. memcpy / memset 的 void*//C语言无默认String类型 //仅仅单引号char类型 #include string.h int main(void) { int a 10, b; memcpy(b, a, sizeof a); // void* 接收任意对象地址 memset(b, 0, sizeof b); // 把 b 清零 return 0; } ///void *memcpy(void *dest, const void *src, size_t n); ///void *memset(void *s, int c, size_t n);5. 泛型查找返回 void*#include stddef.h void *find(void *base, size_t n, size_t size, const void *key, int (*cmp)(const void *, const void *)) { unsigned char *p base; for (size_t i 0; i n; i) { if (cmp(p i * size, key) 0) { return p i * size; // 返回找到的元素地址 } } return NULL; }6. void** 作为输出参数(略)7. 回调函数中的 user_data(略)8. 结构体中保存任意类型//结构体定义仅标识 struct Node { void *data; struct Node *next; }; //释放管理数据域内存 //释放结构体指针节点内存 free(node-data); free(node);常见语法错误序号语法错误类型示例1不能直接解引用 void*void *p x;// *p 10; // 错误*(int *)p 10; // 正确2不能直接对 void* 做指针算术标准 Cvoid *p arr;// p; // 标准 C 不允许char *q p;q; // 正确3void* 与对象指针可自动转换C 中int *ip malloc(sizeof *ip); // 可以void *vp ip; // 可以ip vp; // 可以4const void* 表示只读输入void print(const void *p, size_t size);5void* 通常不用于函数指针void (*fp)(void);// void *p fp; // 不可移植6free 可以直接接收 void*void *p malloc(100);free(p);总结void* 适合做泛型接口malloc、memcpy、qsort、回调 user_data、泛型容器都靠它。但用它时通常要配合 类型转换 长度/大小 比较函数否则无法安全操作。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑