VOID类型的指针的深刻理解
- 格式:pdf
- 大小:469.00 KB
- 文档页数:7
c语言void的用法许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。
下面小编就跟大家介绍下c语言void 的用法。
c语言void的用法1.void的含义void的字面意思是“无类型”,void*则为“无类型指针”,void*可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:voida;这行语句编译时会出错,提示“illegaluseoftype'void'”。
不过,即使voida的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:(1)对函数返回的限定;(2)对函数参数的限定。
我们将在第三节对以上二点进行具体说明。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:float*p1;int*p2;p1=p2;其中p1=p2语句会编译出错,提示“'=':cannotconvertfrom'int*'to'float*'”,必须改为:p1=(float*)p2;而void*则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:void*p1;int*p2;p1=p2;但这并不意味着,void*也可以无需强制类型转换地赋给其它类型的指针。
因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。
道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。
下面的语句编译出错:void*p1;int*p2;p2=p1;提示“'=':cannotconvertfrom'void*'to'int*'”。
浅谈void及void指针在编程的过程中,大家都很熟悉void,但是对于void指针恐怕就没有那么熟悉吧,今天我在这里进行一些浅谈,希望对各位朋友有一定的帮助。
首先我们要知道数据类型,什么是数据类型,可以理解为一种数据的结构,每种数据类型都有相应的数据结构,既然是结构那么就有相应的结构信息,包括在内存中占有多少字节等等的东西。
内存是连续的,我们通常都说电脑的内存是2G,那么内存是在电脑出厂或者内存条出厂的时候就制定了每一个内存单元的标识的,内存是由内存单元组成的,一个内存单元我们通常是用一个字节来描述的,内存单元是由电荷位组成的,也就是说一个内存单元是由8个电位组成的,不要问我为什么是8个,我也不知道,呵呵。
好了,知道了内存单元,那么我们就能够知道数据类型的具体东西了,通常我们说一个int类型的变量占有4个字节,也就是说我们定义了一个变量那么它在内存里面是占有连续的4个字节。
好了,终于到了主题,那么void是什么数据类型呢,我的理解为未知的数据类型,这里的未知是指不知道在内存中占有多少字节,因此编译器在编译的过程中也就不能为其分配内存,所以我们就不能定义void类型的变量,那么void 指针又是怎么回事呢?首先明白,指针是存放对象地址(当对象占有多个字节的时候,存放的是第一个字节的地址)对象,而CPU就根据这个指针对象所存放的地址去进行一些操作,由于CPU是32位的,也就是我们通常说的32位机,那么CPU的寻址范围就是2的32次方,也就是4G的地址空间,而内存又只有2G,所以为了不浪费CPU的寻址能力,操作系统就提供了一种虚拟内存。
(扯远了)好了,CPU能够寻找2的32次方的地址空间,而一个字节只有8位,那么4个字节刚好能够把CPU所有的寻址空间都能够表述出来,因此所有的指针都是4个字节。
那么为什么我们平时还在定义不同数据类型的指针呢,可以直接定义一个数据指针就解决了我所有问题啊!你很聪明,不过设计C++语言的人比我们更聪明,如果我们都用一种数据类型来表示我们的地址,那么当一个int类型的变量的第一个字节的地址被保存到指针变量中的时候和一个char类型的变量的地址被保存到指针变量中的时候我们怎么知道是char类型的地址还是int类型的地址呢,因此指针变量包含了一个信息就是这个变量描述的地址应该是几个字节连续的,比如说我们定义了一个int类型的指针,那么指针变量知道这个地址是后面三个字节都是连续的,因此不能分开,是一个整体。
Void
1.void的含义
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:
void a;
这行语句编译时会出错,提示“illegal use of type 'void'”。
不过,即使void a 的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:
(1)对函数返回的限定;
(2)对函数参数的限定。
2、任何类型的指针都可以直接赋值给void *类型,无需进行强制类型转换:
void *p1;
int *p2;
p1 = p2;
但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。
因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。
道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。
void与NULL详解
void 是 “空”类型(⽆值型),意思是这种类型的⼤⼩⽆法确定。
并不存在void类型的对象,所以也就不能声明void类型的对象或者将sizeof()运算符⽤于void类型,C++/C语⾔不能对⼀个⼤⼩未知的对象直接操作。
void 通常⽤来定义函数的返回类型,参数列表(⽆参)或者void指针。
void指针可以作为通⽤指针,因为它可以指向任何类型的对象。
void指针与NULL指针值之间的区别:
NULL是可以赋值给任何类型指针的值0,在C语⾔中它的类型为void*,⽽在标准的C++语⾔中由于允许从0到任何指针类型的隐式转换,因此NUll就是整数0.
即:
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void*)0)
#endif
⼀个void*类型的指针是⼀个合法的指针,常⽤于函数参数中来传递⼀个函数与其调⽤者之间约定好的类型的对象地址,例如在线程函数中;⽽⼀个值等于NULL的指针虽也是⼀个合法的指针,但不是⼀个有效的指针。
c语言中void函数的用法摘要:一、前言二、C 语言中void 函数的定义1.void 类型的含义2.void 函数的特点三、void 函数的用法1.返回值为void 的函数2.参数为void 类型的函数3.void 指针类型四、void 函数的实际应用1.函数指针2.回调函数五、总结正文:C 语言是一种通用的、过程式的计算机程序设计语言,广泛应用于底层开发。
在C 语言中,void 函数是一种特殊的函数类型,它不返回任何值,也不接受void 类型的参数。
本文将详细介绍C 语言中void 函数的用法。
首先,我们需要了解void 类型的含义。
在C 语言中,void 类型表示空类型,即不包含任何有效数据。
void 函数的特点是不返回任何值,因此,它的返回类型为void。
这意味着调用void 函数时,我们不能从函数返回值。
void 函数的用法有以下几种:1.返回值为void 的函数这种类型的函数不返回任何值,通常用于执行一些操作,而不需要返回结果。
例如,void print_hello() {printf("Hello, world!");}2.参数为void 类型的函数这种类型的函数接受一个void 类型的参数,通常用于传递一个函数指针。
例如,void (*callback)(void) {// 函数体}3.void 指针类型void 指针类型用于存储void 类型的数据,它可以指向任何不返回值的函数。
例如,void (*ptr)(void) = print_hello;void 函数的实际应用非常广泛,例如在函数指针和回调函数中。
函数指针是一个指向函数的指针,它可以用作其他函数的参数。
例如,void print_hello_ptr(void (*func)(void)) {func();}回调函数是一种特殊的函数,它接受一个函数指针作为参数,并在需要时调用该函数。
例如,void call_callback(void (*callback)(void)) {callback();}总之,C 语言中的void 函数是一种非常有用的功能,它可以帮助我们在程序设计中实现一些特殊的需求。
在c语言中void的作用在C语言中,void是一个关键字,用来表示一个函数没有返回值或一个指针没有特定类型的指针。
void的作用主要有以下几个方面:1.函数返回值为空:void可以用来表示一个函数没有返回值。
在C语言中,函数可以返回各种类型的值,如整数、浮点数、字符等。
但是有些函数仅仅是用来执行一系列操作,而不需要返回任何值。
比如,当我们需要打印一些信息或执行一些操作时,可以将函数的返回类型声明为void。
例如:```void printMessageprintf("Hello, World!\n");```在上面的例子中,printMessage(函数不需要返回任何值,它仅仅打印一条消息。
使用void作为返回类型可以明确表明这一点。
2.函数参数为空:在C语言中,函数可以有参数,用来接收传递给函数的值。
有时候我们需要定义一个函数,不需要任何参数。
这时我们可以使用void来表示函数没有参数。
例如:```int getRandomNumber(void)return rand(;```在函数定义中,使用void关键字表示函数没有参数,即不接收任何值。
3.指针类型未知:void可以用来声明一个指针,而不指定具体的数据类型。
这在涉及多种数据类型的程序中非常有用。
例如,在编写通用内存分配函数时,可以使用void指针来分配内存,并将其转换为其他数据类型的指针。
例如:```void* allocateMemory(size_t size)void* memory = malloc(size);return memory;```在上面的例子中,allocateMemory(函数使用void指针来分配内存。
因为void指针没有特定的数据类型,可以将其转换为任何其他类型的指针。
4.泛型指针:void指针也可以用作泛型指针,以便在不同的数据类型之间进行转换。
在C语言中,没有内置的泛型类型,但可以使用void指针来模拟泛型。
C/C++语言void及void指针1.void的含义void的字面意思是“无类型”,void*则为“无类型指针”,void*可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:这行语句编译时会出错,提示“illegal use of type'void'”。
不过,即使void a的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:(1)对函数返回的限定;(2)对函数参数的限定。
我们将在第三节对以上二点进行具体说明。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:其中p1=p2语句会编译出错,提示“'=':cannot convert from'int*'to'float*'”,必须改为:而void*则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:但这并不意味着,void*也可以无需强制类型转换地赋给其它类型的指针。
因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。
道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。
下面的语句编译出错:提示“'=':cannot convert from'void*'to'int*'”。
2.void的使用下面给出void关键字的使用规则:规则一如果函数没有返回值,那么应声明为void类型在C语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。
但是许多程序员却误以为其为void类型。
例如:程序运行的结果为输出:2+3=5这说明不加返回值说明的函数的确为int函数。
005CC++数据类型_void
1.void的字⾯意思是'⽆类型'.void * 是⽆类型指针,void * 可以指向任何类型的数据.
2.数据类型的分装: int InitHardEnv(void ** handle);
典型的内存操作函数: void * memcpy( void *dest, const void *src, size_t len );
void * memset( void *buffer, int c, size_t num );
3. void修饰函数的返回值和参数时表⽰没有返回值和参数. void function(void);
4. void指针:
C语⾔中只有相同类型的指针才可以互相赋值.
void * 作为左值,可以接受任意类型的指针赋值.
void * 作为右值赋值给其他类型指针时,需要强制转换类型.
int *p1 = NULL;
char *p2 = (char *) malloc( sizeof( char ) * 20 );
5. 不存在void类型变量.
C语⾔没有定义void占⽤多⼤内存.
printf( "sizeof(void):%d", sizeof( void ) ); //编译不能通过."不允许使⽤不完整的类型".
void a; //定义⼀个void类型变量,错误,编译不通过,因为编译器不知道要分配多少内存.。
void指针的背后藏着什么?1. 不能动的“地址”之 void指针1.1 void指针初探void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据。
和用int表示指针异曲同工,只是更明确是“指针”。
因此void *只能表示一个地址,不能用来&取值,也不能++和--移动指针,因此不知道多少字节是一个数据单位。
int nums[] = {3,5,6,7,9};void* ptr1 = nums;//int i = *ptr1; // 对于void指针没法直接取值int* ptr2 = (int*)nums;printf('%d,%d\n',ptr1,ptr2);int i = *ptr2;printf('%d\n',i);从输出结果可以看出,无论是无类型的void指针还是int类型指针,指向的地址都是一样的:PS:void *就是一个不能动的“地址”,在进行&、移动指针之前必须转型为类型指针。
1.2 void指针的用途这里我们看一下我们之前了解的memset函数,其第一个参数就是一个void指针,它可以帮我们屏蔽各种不同类型指针的差异。
如下面代码所示,我们既可以传入一个int类型数组的指针,也可以传入一个char类型数组的指针:int nums[20];memset(nums,0,sizeof(nums));char chs[2];memset(chs,0,sizeof(chs));那么,我们也可以试着自己动手模拟一下这个memset函数,暂且命名为mymemset吧:void mymemset(void *data,int num,int byteSize){// char就是一个字节,而计算机中是以字节为单位存储的char *ptr = (char*)data;int i;for(i=0;i<byteSize;i++){*ptr=num;ptr++;}}int main(int argc, char *argv[]){int nums[20];mymemset(nums,0,sizeof(nums));int i,len=sizeof(nums)/sizeof(int);for(i=0;i<len;i++){printf('%d ',nums[i]);}printf('\n');return 0;}在这个mymemset函数中,我们利用void指针接收不同类型的指针,利用char类型(一个字节)逐个字节读取内存中的每一个字节,最后依次填充指定的数字。