当前位置: 首页 > news >正文

void*在c语言中什么意思(非常详细)

讲解 C语言 void* 指针类型之前,先来看下面程序中的 swap() 函数,为了实现交换两个 int 类型的变量,必须向 swap() 函数中传入指向这两个 int 类型变量的指针:

void swap(int *x, int *y)
{int temp = *x;*x = *y;*y = temp;
}

但是,参数类型指定为 int*,使得函数 swap() 只能交换 int 类型的变量。如果我们想让 swap() 更加通用,能够交换不同类型的变量,那么该怎么办呢?

为了使 swap() 函数更加通用,我们可以使用 void* 指针。void* 指针是一种通用指针类型,可以指向任何类型的数据。

修改后的 swap() 函数如下:

void swap(void *x, void *y, int size)

上述代码中的参数 x 和 y 都是 void* 指针类型。

void* 指针是一种特殊的指针类型,可以指向任何数据类型的对象。与其他类型的指针不同,void* 指针不能直接对其指向的对象进行操作,因为编译器无法确定其指向的数据类型及其大小。

例如:

int n;
void *p = &n;  //  int *赋值给void *,仅保存首地址,丢失了数据类型
*p;            //  错误,无法确定数据类型和大小,因此无法取值
p + 1;         //  错误,无法确定数据类型和大小,因此无法进行加减运算

同时,上面的代码还增加了一个参数 size,这个参数表示要交换的内存块的大小,单位是字节。例如:如果需要交换 char 类型的数据,那么将 size 参数传递给 sizeof(char),也就是 1 字节;如果需要交换 double 类型的数据,那么将 size 参数传递给 sizeof(double),也就是 8 字节。

根据上述的内容,我们可以对 swap() 函数进行修改,使其能够交换不同类型的变量,代码如下:

/**
*  快速入门C语言 https://xiecoding.cn/c/
**/
#include <stdio.h>
void swap(void* x, void* y, int size)
{// 将指针转换为char *,单个字节操作内存char* pX = (char*)x;char* pY = (char*)y;char temp;for (int i = 0; i < size; i++){temp = pX[i];pX[i] = pY[i];pY[i] = temp;}
}
int main()
{double a = 3.0, b = 5.0;printf("a=%f b=%f\n", a, b);// 交换变量 a 和 bswap(&a, &b, sizeof(double));printf("a=%f b=%f\n", a, b);return 0;
}

运行结果为:

a=3.000000 b=5.000000
a=5.000000 b=3.000000

首先,swap() 函数将两个 void* 类型的指针 x 和 y 转换为 char*  类型的指针 pX 和 pY。这样做的原因是,char 类型的大小为 1 字节,这允许我们在后面的循环中逐字节地操作内存。

然后,我们定义了一个 char 类型的变量 temp,用于在交换过程中存储临时数据。

接着,我们使用一个 for 循环,从 0 到 size - 1,循环地交换两个内存块中的内容。循环的每次迭代都会执行以下操作:

  • 将 pX 指针指向的内存块中的第 i 个字节保存到 temp 中;
  • 将 pY 指针指向的内存块中的第 i 个字节复制到 pX 指向的内存块的第 i 个字节;
  • 将 temp 中的值复制到 pY 指向的内存块的第 i 个字节。

这样,在循环结束后,两个内存块中的内容就被完全交换了。只要提供了正确的内存块大小,这个函数就可以用于交换任意类型的数据。

需要注意的是,在使用 swap() 函数时,需要保证传入的内存块大小和实际数据类型的大小一致,否则可能会导致数据出错。

相关文章:

  • 【MVCP】基于解纠缠表示学习和跨模态-上下文关联挖掘的多模态情感分析
  • 5月8日直播见!Atlassian Team‘25大会精华+AI实战分享
  • 蓝桥杯2025年第十六届省赛真题-水质检测
  • oracle 优化器
  • 【数据结构入门训练DAY-28】蓝桥杯算法提高VIP-产生数
  • 从交互说明文档,到页面流程图设计全过程
  • NGINX `ngx_http_charset_module` 字符集声明与编码转换
  • K8S 基于本地存储的持久卷
  • QUIC协议优化:HTTP_3环境下的超高速异步抓取方案
  • DIFY教程第五弹:科研论文翻译与SEO翻译应用
  • 解决二分类问题常用的模型以及优缺点和使用场景(二)
  • Linux 修改bond后网关不生效的问题
  • 指定Docker镜像源,使用阿里云加速异常解决
  • WordPress_depicter Sql注入漏洞复现(CVE-2025-2011)
  • Spring MVC中跨域问题处理
  • Spark的基本介绍
  • 电子电器架构 --- 网关释放buffer的必要性
  • 深入探索Linux命名管道(FIFO):原理、实践与高级技巧
  • 新手开发微信小程序遇到的坑
  • Facebook的元宇宙新次元:社交互动如何改变?
  • “犍陀罗艺术与亚洲文明”在浙大对外展出
  • 姚洋将全职加盟上海财经大学,担任滴水湖高级金融学院院长
  • 同济大学原常务副校长、著名隧道及地下工程专家李永盛逝世
  • 新华时评:中国维护国际经贸秩序的立场坚定不移
  • 黑灰产工作室为境外诈骗集团养号引流,冒充美女与男性裸聊后敲诈勒索
  • 习近平同瑞典国王卡尔十六世·古斯塔夫就中瑞建交75周年互致贺电