首页>>科技 >>内容

c++ void指针的介绍,一文揭秘C语言的void指针

发布时间:2023-07-21 18:18:20编辑:温柔的背包来源:

很多朋友对c++ void指针的介绍,一文揭秘C语言的void指针不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

c++ void指针的介绍,一文揭秘C语言的void指针

1.不可移动“地址”的空指针1.1空指针初探。void *表示一个“未知类型”的指针,所以我不知道这个指针地址有多少字节是一个数据。和用int表示指针是一样的,但更明确的是“指针”。所以void *只能代表一个地址,不能用来取值,也不能用-移动指针,所以多少字节为一个数据单元是未知的。

intnums[]={3,5,6,7,9 };void * ptr1=nums//inti=* ptr 1;//对于void指针,不能直接取值int * ptr 2=(int *)nums;printf('%d,%d 'ptr1,ptr 2);inti=* ptr2printf('%d 'I);从输出结果可以看出,无论是非类型化的void指针还是int指针,都指向同一个地址:PS: void *是一个不可移动的“地址”,在移动或移动指针之前必须转换成类型指针。1.2 void指针的用途

这里,我们来看看之前学过的memset函数。它的第一个参数是一个void指针,可以帮助我们屏蔽不同类型指针的差异。如下面的代码所示,我们既可以传入一个指向int类型数组的指针,也可以传入一个指向char类型数组的指针:int nums[20];memset(nums,0,sizeof(nums));charchs[2];memset(chs,0,sizeof(CHS));然后,我们也可以尝试自己模拟这个memset函数,暂时命名为mymemset:

Voidmymeset (void * data,intnum,int bytesize) {//char为字节,char*ptr=(char*)数据以字节为单位存储在计算机中;intifor(I=0;I在这个mymemset函数中,我们用void pointer接收不同类型的指针,用char type(一个字节)逐个读取内存中的每个字节,最后依次填入指定的数字。因为char类型是具体类型,所以可以使用或-来移动指针。

对于结构类型,也可以使用我们的mymemset函数:typedef struct _ Person { char * name;进口;}人;Personp1mymemset(p1,0,sizeof(Person));printf('p1。年龄:%d 'P1 . age);最终运行结果如下图所示:void *的用途:只知道内存,但不知道是什么类型的时候。2函数指针2.1函数指针我们可以很容易地在C中定义一个函数指针:typedefvoid(* int func)(inti);

这里我们定义了一个函数指针intFunc,没有返回值,只有一个int类型的参数。我们可以在主函数中使用这个函数指针指向一个特定的函数(这个特定的函数定义需要和函数指针的定义一致):

void test1(intage){ printf(' test1:% d 'age);}intmain(void){//声明一个intFunc类型的函数指针,intFuncf1=test1//指针指向的执行f1函数的代码区f1(8);return0最终运行结果如下图所示,通过执行函数指针f1来执行它所指向的具体函数:2.2函数指针的基本使用。

这里我们通过一个小案例来介绍函数指针的基本用法。我相信大部分C#或者Java程序员都熟悉foreach,所以我们模拟foreach对int数组中的值进行不同的处理。for循环中体现的代码是可重用的,但是如何处理这些数据是不确定的,所以处理数据的逻辑是由函数指针指定的。voidforeachNums(int*nums,intlen,int func func){ inti;for(I=0;我

让我们将printNum函数作为函数指针传递给main函数中的foreachNums函数。intnums[]={1,5,666,23423,223 };foreachNums(nums,sizeof(nums)/sizeof(int),print num);最终运算的结果如下图所示:通过函数指针,我们可以屏蔽各种具体处理方法的差异,即所有的不确定因素都依赖于抽象,这也是面向抽象或面向接口编程的本质。三、函数指针应用案例3.1计算任何类型的最大值

(1)定义函数指针和getMax体:

typedefinit(* compare func)(void * data 1,void * data 2);//get max函数的参数说明://data要比较的数据数组的第一个地址,uniteSize单元中的字节数//length:数据的长度。

{1,3,5,6 }:length=4//比较data1和data2指向的数据,//如果data1data2,返回正数void * getmax (void * data,integer size,int length,comparefuncfunc){ inti;char*ptr=(char*)数据;char * max=ptrfor(I=1;i0){ max=item;} } returnmax}这里可以看到,getMax中比较多少字节是由compareFunc指向的函数完成的,getMax根本不需要关心。

(2)定义符合函数指针定义的不同类型的函数:intintDataCompare(void*data1,void * data 2){ int * ptr 1=(int *)data1;int * ptr 2=(int *)data 2;inti 1=* ptr 1 inti 2=* ptr 2 return 1-I2;} typedefstruct _ Dog { char * name进口;}狗;intdogDataCompare(void*data1,void * data 2){ Dog * Dog 1=(Dog *)data1;狗*狗2=(狗*)数据2;返回(狗1-年龄)-(狗2-年龄);}(3)在主要的函数中针对(同国际组织)国际组织类型和结构体类型进行调用:

intmain(intargc,char * argv[]){//test1:int tipp hchstwertintnums[]={ 3,5,8,7,6}int*pMax=(int*)getMax(nums,sizeof(int),sizeof(nums)/sizeof(int),intdata compare);intmax=* pmaxprintf('%d '最大值);//test2:Grter Wert der strukturdogdogdogs[]={ { '沙皮,3} ,香肠"""10,""""哈士奇"5",京巴""""""""""""大的狗, 2 ) ;Dog*pDog=(Dog*)getMax(dogs,sizeof(Dog),sizeof(dogs)/sizeof(Dog),dogdata compare);printf('%s=%d 'pDog-name,pDog-age);return0这是什么意思?

3.2 C中的自定义排序qsort函数包含在头文件中。该函数根据你给的比较条件进行快速排序,排序是通过指针移动实现的。排序后的结果仍然在原始数组中。要使用qsort函数,您必须自己编写一个比较函数。我们可以看看qsort函数的原型:void qsort (void * base,size _ tnum,size _ tsize,int (* comparator) (constvoid *,const void *);intnums[]={3,5,8,7,6 };qsort(nums,sizeof(nums)/sizeof(int),sizeof(int),intdata compare);intifor(I=0;我

回顾唐子红

以上知识分享希望能够帮助到大家!