C语言中void的高级应用

article/2025/10/12 21:34:54

C语言中void的高级应用

C语言中的void关键字,void 表示为“无”、“空”、“没有”的意思。所以void是不能用来定义变量的,因为变量是需要固定的空间的

//定时时,编译不通过
void ch = 'a';
void a = 10;

一、void的常用场景

1.1 函数的参数

void 最常使用就是用在函数里面,第一个就是函数的参数

int function(void);
int function();

这两个函数表示的意义是一样的,都是无参数、返回值为 int 类型的函数。

1.2函数的返回类型

void 的另一个作用,就是在函数的返回类型上面。

有时候,我们只需要函数运行的过程,而不是为了获取最后的结果。此时就可以使用 void 类型,表示该函数没有返回值。

void function(int a, int b);

以上void的常用场景,就不多细讲解了。

二、void的高级应用

*void 的高级应用其实就void 指针。

void指针一般被称为通用指针或叫泛指针。它是C语言关于纯粹地址的一种约定。当某个指针是void型指针时,所指向的对象不属于任何类型。 因为void指针不属于任何类型,则不可以对其进行算术运算,比如自增,编译器不知道其自增需要增加多少。比如char *型指针,自增一定是指针指向的地址加1,short *型指针自增,则偏移2。

当使用关键字void声明指针变量时,它将成为通用指针变量。任何数据类型(char,int,float等)的任何变量的地址都可以赋值给void指针变量。

对指针变量的解引用,使用间接运算符*达到目的。但是在使用空指针的情况下,需要转换指针变量以解引用。这是因为空指针没有与之关联的数据类型。编译器无法知道void指针指向的数据类型。因此,要获取由void指针指向的数据,需要使用在void指针位置内保存的正确类型的数据进行类型转换。

来看下linux下的函数,它就是就是使用了void指针。

*void 做为形参

#include <pthread.h>
//线程创建 void *arg
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

*void 做为函数返回值

#include <sys/mman.h>
//IO映射  void * 函数返回void *
void *mmap(void *addr, size_t len, int prot, int flags,int fildes, off_t off);

2.1 void *做为形参

void *做为形参,实参可以是变量、数组、结构体指针。下面分别分三个案例分析,如果使用void *

2.1.1 void *做为形参,实参是变量

#include <stdio.h>//函数声明
int int_fum(void *a, void *b);int main(void)
{//变量可以是char short int long float double类型int i = 100, j = 200, num;//调用时,必须要强制转成指针类型 int *num = int_fum((int *)&i, (int *)&j);printf("num:%d\n", num);return 0;
}int int_fum(void *a, void *b)
{int num;//在使用时,必须强制说明是什么类型指针 且强制转的类型要与调用时是一致的。num = (*(int *)a) + (*(int *)b);return num;
}

输出结果

num:300

2.1.2 void *做为形参,实参是数组

#include <stdio.h>//函数声明
void arr_fun(void *arr, int len);int main(void)
{//数组可以是char short int long float double类型int arr[10] = {1,2,3,4,5,6,7,8,9,0};arr_fun((int *)arr, 10);return 0;
}void arr_fun(void *arr, int len)
{int i;for(i=0; i<len; i++){//在使用时,必须强制说明是什么类型指针 且强制转的类型要与调用时是一致的。printf("%d\t", *((int *)arr+i));}}

输出

1	2	3	4	5	6	7	8	9	0	

2.1.2 void *做为形参,实参是结构体指针

#include <stdio.h>
#include <stdlib.h>struct  info
{int age;int high;
};//函数声明
void struct_fun(void *stuinfo);int main(void)
{struct  info *stu;//开辟内存空间stu = malloc(sizeof(struct  info));//函数调用struct_fun((struct  info *)stu);//打印结果printf("stu->age:%d\n", stu->age);printf("stu->high:%d\n", stu->high);//释放空间free(stu);return 0;
}void struct_fun(void *stuinfo)
{//强制转换指针类型为struct  info *struct  info *p = (struct  info *)stuinfo;//成员赋值p->age = 10;p->high = 170;
}

结果

stu->age:10
stu->high:170

2.2 void *做为函数返回的指针

2.2.1 返回整型指针

//返回的指针,那么函数必须要给指针开辟相关的空间

#include <stdio.h>
#include <stdlib.h>//函数声明
void *int_fun(int len);int main(void)
{int *p;//调用时,开辟的空间强制转化为指向整型的指针 (int *)p = (int *)int_fun(4);//对开辟的空间进行赋值*p = 100;printf("*p:%d\n", *p);//释放空间free(p);return 0;
}void *int_fun(int len)
{//必须定义为void *的指针。void *p;//开辟空间p = malloc(len);//返回void *指针,与函数要求返回类型一致。return p;
}

输出结果

*p:100

2.2.2 返回数组指针

#include <stdio.h>
#include <stdlib.h>//函数声明
void *arr_fun(int len);int main(void)
{int i;//定义数组int arr[10];int *parr = arr;//调用时,开辟的空间强制转化为指向整型的指针 (int *)  parr = (int *)arr_fun(sizeof(arr));//对数组进行赋值for(i=0; i<10; i++){*(parr+i) = i*i;}//对数组进行打印for(i=0; i<10; i++){printf("%d\t", *(parr+i) );}//释放空间free(parr);return 0;
}void *arr_fun(int len)
{//必须定义为void *的指针。void *p;//开辟空间p = malloc(len);//返回void *指针,与函数要求返回类型一致。return p;
}

输出

0	1	4	9	16	25	36	49	64	81

2.2.2 返回结构体指针

#include <stdio.h>
#include <stdlib.h>struct  info
{int age;int high;
};//函数声明
void *struct_fun(int len);int main(void)
{int i;struct  info *stu;//调用时,开辟的空间强制转化为指向整型的指针 (struct  info *)  stu = (struct  info *)struct_fun(sizeof(struct  info));//对结构体进行赋值stu->age = 10;stu->high = 170;//打印结果printf("stu->age:%d\n", stu->age);printf("stu->high:%d\n", stu->high);//释放空间free(stu);return 0;
}void *struct_fun(int len)
{//必须定义为void *的指针。void *p;//开辟空间p = malloc(len);//返回void *指针,与函数要求返回类型一致。return p;
}

输出结果

stu->age:10
stu->high:170

终于写完了,麻了!!!!!!!!!!!!

在这里插入图片描述


http://chatgpt.dhexx.cn/article/hDsSoWYC.shtml

相关文章

【C语言】void 和 void* 类型

一. void 类型 1. 为何不能定义 void 类型的变量 为什么不能定义 void 类型的变量&#xff1f;因为它是空类型&#xff0c;不能够为变量提供空间吗&#xff1f; 定义变量的本质是开辟空间&#xff0c;我们用 sizeof 来计算 void 类型的大小&#xff1a; 在vs2017下&#xf…

函数类型——void(无类型函数)

void属于函数类型中的无类型函数之对应的还有实型&#xff08;float,double&#xff09;&#xff0c;整型&#xff08;int&#xff09;&#xff0c;布尔型&#xff08;bool&#xff09;和字符型&#xff08;char&#xff09;。 在介绍void之前先介绍“返回值”&#xff1a; 就…

C语言中的void*是什么?

目录 1.void *是什么2.void*的解引用3.void*类型的应用场景 1.void *是什么 我们之前学过许多类型的指针变量&#xff0c;如整形指针&#xff0c;字符指针&#xff0c;甚至数组指针&#xff0c;函数指针等。 int a 10; int *pa &a;//整形指针pa接受一个整形变量a的地址…

C语言中的void类型函数

最重要的一点是void类型函数里不能出现return语句 &#xff0c;因为与常见的int double float char等数据类型不同&#xff0c;void是一个空类型&#xff0c;也就是说函数没有返回值&#xff0c;所以也不给主函数提供&#xff08;或返回&#xff09;任何信息 一般声明变量时不…

【C语言】如何理解【void(*)(void)】

1.理解【void(*)(void)】 引用阅读 如何理解【void(*)(void)】 void(*)(void) --表示一个返回值为void&#xff0c;没有参数的函数指针 (void(*)(void))--表示【将func这个函数强转成返回值为void&#xff0c;没有参数的函数】的类型转换 测试sizeof(void(*)(void)) #inc…

C语言中的void

文章目录 一.void概要二.void应用场景2.1void能定义变量吗&#xff1f;2.2void这个类型有大小吗&#xff1f;2.3void*能定义变量吗&#xff1f;2.4void*使用2.5void*能不能进行对应的指针运算&#xff1f;2.6void和函数返回值2.7函数void类型的参数 一.void概要 void就是空的意…

C语言 --- void的用法解析

文章目录 一、简介二、用法三、总结 一、简介 ​ void 中文翻译为"无类型"&#xff0c;有的也叫"空类型"。常用在程序中对定义函数的参数类型、返回值、函数中指针类型进行声明。 二、用法 首先应该注意一点的是void类型是不同于其他常见类型的&#xf…

Python爬虫实现英汉互译

用requests模块实现英汉词汇简单互译 1.找到地址&#xff1a; 2.完成代码&#xff1a; import jsonimport requestsurl "https://fanyi.baidu.com/sug" headers {"User-Agent": Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit…

Python 爬虫笔记

Python 爬虫笔记 HTTP协议requests模块get() 和post()函数headers 数据解析正则表达式bs4解析-HTML语法Xpath 批量爬取百度图片selenium 毕设与图像分类相关&#xff0c;所以需要大量的图片数据&#xff0c;所以先学学爬虫爬图片。 本文作为自学笔记&#xff0c;仅供参考 声明&…

爬虫入门练习

目录 网络爬虫一、爬取[南阳理工OJ题目](http://www.51mxd.cn/problemset.php-page1.htm)python代码结果 二、爬取[重交新闻](http://news.cqjtu.edu.cn/xxtz.htm)python代码结果 小结 网络爬虫 简介 网络爬虫英文名叫Web Crawler戒WebSpider。是一种自动浏览网页并采集所需要…

python爬虫网络中断_python爬虫中断

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 当redis的队列为空时&#xff0c;爬虫会重新爬取&#xff1b; 当队列不为空时&#xff0c;爬虫便会接着上次…

爬虫知识综合

1. Scrapy怎么设置深度爬取? 通过在settings.py中设置DEPTH_LIMIT的值可以限制爬取深度&#xff0c;这个深度是与start_urls中定义url的相对值。也就是相对url的深度。若定义url为http://www.domz.com/game/,DEPTH_LIMIT1那么限制爬取的只能是此url下一级的网页。深度大于设…

爬虫之异步爬虫asyncio

与异步爬虫的相见 文章目录 一、asynico是什么&#xff1f;二、使用步骤 1.普通用法2,在爬虫里面的用法 一、asynico是什么&#xff1f; 简言之&#xff0c;就是用这个库可以来实现异步IO 二、使用步骤 1&#xff0c;普通用法 1&#xff0c;下面我们来看一个案例&#xff1…

网络爬虫之规则

网络爬虫之规则 一.Requests库的get()方法1.1requests库的安装1.2 测试requests库的效果1.3 requests库的7个主要方法1.4 requests中的get方法1.5 Response对象的属性&#xff08;牢记&#xff09;1.6 理解Response的编码1.7 对以上知识的讲解运用 二.爬取网页的通用代码框架2.…

网络爬虫入门学习

文章目录 一、初识网络爬虫1.1 网络爬虫定义1.2 爬虫原理1.3 爬虫工作的过程 二、示例一2.1 需要的内置库以及第三方库2.2 具体代码2.3 结果展示&#xff1a; 三、示例二3.1 确定要爬取信息的位置3.2 具体代码3.3 结果展示 四、总结五、参考文献 一、初识网络爬虫 1.1 网络爬虫…

爬虫-Python编程入门

文章目录 一.爬虫1.初识网络爬虫2.网络爬虫的分类2.1 通用网络爬虫2.2 增量爬虫2.3 垂直爬虫2.4 Deep Web爬虫 3.Robots协议 二.创建anaconda虚拟环境三.爬取网站 http://www.51mxd.cn/练习题目数据并保存四.爬取网站http://news.cqjtu.edu.cn/xxtz.html中近几年的消息通知的发…

python爬虫提取人名_python爬虫—爬取英文名以及正则表达式的介绍

python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一. 爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个csv文件中;再读取csv文件当中的每个英文名链接,采用循环的方法读取每一个英文名…

python爬虫什么意思-python的爬虫是什么意思

Python爬虫即使用Python程序开发的网络爬虫(网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。其实通俗的讲就是通过程序去获取 web 页面上自己想要的数据,也就是自动抓取数…

python爬虫英文单词_Python_爬虫百度英文学习词典

主方法main 定义主函数main&#xff0c;程序的入口&#xff0c;首先导入io包&#xff0c;用os.path.exists判断字典文件是否存在&#xff0c;如果不存在则新建一个&#xff0c;然后进入循环中&#xff0c;让用户输入相应的数字&#xff0c;执行相应的功能。 def main(): fla…

爬虫基础知识

一、Scrapy 1、cookie设置 目前cookie的设置不支持在headers进行设置&#xff0c; 需要通过以下三种方式进行设置: 第一种&#xff1a;setting文件中设置cookie 当COOKIES_ENABLED是注释的时候&#xff0c;scrapy默认没有开启cookie。当COOKIES_ENABLED没有注释设置为False的…