void 指针的背后藏着什么? void是什么意思

void是什么意思(void指针后面隐藏着什么?)
1 不能动的“地址”之 void指针

void 指针的背后藏着什么? void是什么意思

文章插图
【void 指针的背后藏着什么? void是什么意思】
1.1 void指针初探Void *代表一个“未知类型”的指针,所以我不知道从这个指针地址来看,一条数据有多少字节 。用int表示指针类似,但更明确的是它是“指针” 。
所以void *只能代表一个地址,不能用来取值,也不能++和-move指针,所以不知道一个数据单元是多少字节 。
intnums[]={3,5,6,7,9};void*ptr1=nums;//inti=*ptr1;//对于void指针没法直接取值int*ptr2=(int*)nums;printf( %d,%d\n ,ptr1,ptr2);inti=*ptr2;printf( %d\n ,i);从输出结果可以看出,无论是非类型化的void指针还是int指针,指向的地址都是相同的:
void 指针的背后藏着什么? void是什么意思

文章插图

PS: void *是一个不可移动的“地址”,在移动指针之前,必须将其转换为类型指针 。
1.2 void指针的用处
void 指针的背后藏着什么? void是什么意思

文章插图

在这里,让我们看看我们以前知道的memset函数 。它的第一个参数是一个void指针,可以帮助我们屏蔽不同类型指针的差异 。
如下面的代码所示,我们可以传入一个指向int类型数组的指针或一个指向char类型数组的指针:
intnums;memset(nums,0,sizeof(nums));charchs[2];memset(chs,0,sizeof(chs));然后,我们也可以尝试自己模仿这个memset函数,暂时命名为mymemset:
voidmymemset(void*data,intnum,intbyteSize){//char就是一个字节,而盘算机中是以字节为单位存储的char*ptr=(char*)data;inti;for(i=0;i byteSize;i++){*ptr=num;ptr++;}}intmain(intargc,char*argv[]){intnums[20];mymemset(nums,0,sizeof(nums));inti,len=sizeof(nums)/sizeof(int);for(i=0;i i++){printf( %d


    推荐阅读