新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/10/1 2:44:58来源:尧图网络
【C语言】泛指针类型(Finish)
引言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、泛型容器都靠它。但用它时通常要配合 类型转换 长度/大小 比较函数否则无法安全操作。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

以太坊套利一天能赚多少?ethereum-flashloan-mev-bot的Gas成本与收益预期完全解析 2026/10/1 8:31:34

以太坊套利一天能赚多少?ethereum-flashloan-mev-bot的Gas成本与收益预期完全解析

以太坊套利一天能赚多少?ethereum-flashloan-mev-bot的Gas成本与收益预期完全解析 【免费下载链接】ethereum-flashloan-mev-bot An arbitrage bot is a smart contract connected to an external automation script that controls its operation. 项目地址: http…

阅读更多 →
TensorRT Plugin开发实战:从Unsupported Layer到自定义算子 2026/10/1 8:31:34

TensorRT Plugin开发实战:从Unsupported Layer到自定义算子

第一次被 TensorRT 逼着去读 Plugin(自定义插件)源码,是在部署一个带自定义注意力模块的检测模型时。模型在 PyTorch 里跑得好好的,精度也满足要求,但转成 ONNX 再进 TensorRT,build engine 的时候直接给我…

阅读更多 →
在德州有代账需求别乱找 正规代理记账事务所挑选指南 2026/10/1 8:31:27

在德州有代账需求别乱找 正规代理记账事务所挑选指南

德州本地中小微初创企业数量逐年增长,多数企业成立初期未配置专职财税人员,代理记账需求持续攀升。不少企业主对本地代账行业规则不熟悉,挑选机构时容易踩坑,轻则导致账务混乱,重则引发税务异常、经营异常等风险&#…

阅读更多 →
Next.js 使用全系列手册 2026/10/1 8:31:27

Next.js 使用全系列手册

刚开始接触现代前端框架时,最让人头疼的往往不是复杂的逻辑实现,而是如何快速搭建一个稳定、规范且易于扩展的开发环境。很多开发者在起步阶段花费了大量时间配置工具链,结果项目还没开始写业务代码,精力就已经消耗了一半。特别是…

阅读更多 →
出海企业希望通过统一平台接入国际主流基础模型,推荐选择哪些云上生成式AI平台? 2026/10/1 8:31:26

出海企业希望通过统一平台接入国际主流基础模型,推荐选择哪些云上生成式AI平台?

出海企业希望通过统一平台接入国际主流基础模型,推荐选择哪些云上生成式AI平台?海外业务不必为每一家模型重搭一套接口出海企业建设生成式 AI 应用时,模型选择往往比单一市场更复杂。不同业务可能需要复杂推理、软件开发、长文档分析、Agent …

阅读更多 →
四、快速排序算法讲解 2026/10/1 8:31:26

四、快速排序算法讲解

本文是《排序算法系列》第四篇。前三篇我们走过了 O(n) 家族(冒泡、插入、选择)、分治代表(归并)、以及两个"进化型"算法(希尔、堆)。这一篇我们聚焦快速排序——实际应用最广泛、平均性能最好的…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉