C语⾔---void的⽤法解析
⽂章⽬录
⼀、简介
void 中⽂翻译为"⽆类型",有的也叫"空类型"。常⽤在程序中对定义函数的参数类型、返回值、函数中指针类型进⾏声明。
⼆、⽤法
⾸先应该注意⼀点的是void类型是不同于其他常见类型的,即void 类型不能够⽤来申明变量和常量。因为我们申明变量的时候需要明确告诉编译器,该变量是什么类型,⽐如说是int 或 char类型,这样编译才好为这个变量去分配存储空间,但你不能告诉编译器说我这是⼀个"空类型",这样的话编译器肯定不会⼲的,⾃然你编译的时候会报错: "illegal use of type 'void'"。
总的来说,void应⽤最⼴泛的就是跟指针结合,⽽void和指针的结合也⼤⼤扩展了指针的可能性。
void*
/*⽆类型指针,也称为空指针,可以指向任何类型的数据
*注意⼀点:当我们需要使⽤void 类型的的指针变量去指向某⼀类型的变量的时候,必须要对其进⾏类型转换
*/
我们在定义⼀个指针变量的时候第⼀件事就是指定我们指针变量所指向的变量的类型。⼀旦被指定,我们的指针变量就只能指向这⼀类型的变量,即只能保存这⼀类变量的地址。之所以这样呢,是跟我们计算机的存储数据的形式有关。简单来讲,就是不同类型的变量被分配的内存⼤⼩是不⼀样的,当对指针变量去进⾏解引⽤的时候,就必须保证可以取出来正确的内存内容。
第⼀点,我们先看⼀个例⼦,这⾥有⼀个典型的应⽤案例就是malloc函数,我们经常会使⽤到的内存申请函数。请看⼀个⼩例⼦:
int*p_int;
p_int =(int*)malloc(sizeof(int));
先要说明⼀点的是,malloc()分配了内存,但没有为它指定名字,但是它却可以返回那块内存第⼀个字节的地址。因此,可以把那个地址赋值给⼀个指针变量,并使⽤该指针来访问那块内存。因为char代表⼀个字节,所以传统⽤法上曾将malloc()返回值定义为指向char的指针类型。然⽽,ANSIC标准使⽤
了⼀个新类型:指向void的指针。这⼀类型被⽤作“通⽤指针”。
因为malloc分配内存返回的是⼀个void 类型的指针,所以我们在使⽤的时候通常会对该指针类型进⾏强制转换为我们所需要的的指针类型。这样我们就可以使⽤malloc()来为我们分配任意⼤⼩的内存空间(当然了,因为malloc是在堆区分配的内存,所以我们申请的这块内存的⼤⼩应该⼩于堆区的⼤⼩)。
我们知道两个指针变量p1,p2,只有当它们类型相同的时候才能进⾏互相赋值。如果p1,p2指向不同的数据类型,那么他们必须进⾏类型转换才能相互赋值。⽐如:
float*p1;
int*p2;
p1 = p2;
执⾏上⾯⼀段程序的时候我们会发现会报错,提⽰"cannot convert from 'int*' to 'float *`",若改为
int*p1;
void*p2;
p1 = p2;
此时就不会报错,因为赋值运算符的右边进⾏了隐式类型转换。当然了,我们也可以进⾏强制类型转换,即使⽤括号进⾏类型转换,⽐如: int*p1;
void*p2;
p1 =(int*)p2;
从上⾯的例⼦可以看出,当我使⽤void去修饰指针的时候,这种通⽤类型的指针可以很⽅便的和其他类型的指针之间进⾏相关转换。molloc函数
void另⼀个重要的应⽤则就是跟函数进⾏结合主要有以下两个⽅⾯的应⽤。
1. 对函数返回的限定;
2. 对函数参数的限定;
三、总结
1. 如果函数没有返回值那么应声明为void 类型
C语⾔中有⼀个规则,凡是不加返回值限定的函数,就会被编译器作为整型值(int)处理。但是许多⼈却误以为其为void类型。
因为C语⾔不像C++那样有很严格的类型安全检查。所以为了避免混,对于任何函数必须制定其返回值类型。如果函数没有返回值⼀定要声明为void类型。这样既可避免混淆也⽅便⾃⼰和别⼈查看我们的代码。
2. 如果函数⽆参数,那么应该声明其参数为void
如果我们所写的函数不接受任何参数,那么⼀定要指明其参数为void。
3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void *
这⾥有⼏个⽐较常⽤到的函数,都采⽤了此规则。同样,这⼀规则在我们⽇常编程中应⽤也很⼴泛。
/* 内存操作函数 */
void*memcpy(void*dest,const void*src, size_t len);
void memset(void*buffer,int c , size_t num);
int memcmp(const void*sl,const void*s2, size_t n);
/* 内存分配与释放函数 */
void*malloc(size_t size);
void*calloc(size_t num, size_t size);
void*realloc(void*ptr, size_t size);
void free(void*ptr);
可以看到我们⽤void 来修饰了函数参数类型,即我们可以传任意类型指针。这也体现内存操作函数的意义,因为它操作的对象仅仅是⼀⽚内存,⽽不论这⽚内存存储的数据是什么类型。
4. 使⽤void类型指针时应该注意
按照C标准规定,我们不能对void型指针进⾏运算。对有类型的指针进⾏算法操作的时候我们知道,因为其有具体所指向的类型,所以对其的运算是以其所指向的数据类型为单位进⾏的。⽽void的含义为空或者说⽆类型,所以就⽆法对其进⾏算术运算。
运⾏结果为:
我们如果要对void类型指针进⾏算术运算的话就必须进⾏类型转换,这⾥有⼀个典型的应⽤案例就是malloc函数,我们经常会使⽤到的内存申请函数。请看⼀个⼩例⼦:
先要说明⼀点的是,malloc()分配了内存,但没有为它指定名字,但是它却可以返回那块内存第⼀个字节的地址。因此,可以把那个地址赋值给⼀个指针变量,并使⽤该指针来访问该块内存。
因为malloc分配内存返回的是⼀个void 类型的指针,所以我们在使⽤的时候通常会对该指针类型进⾏强制转换为我们所需要的的指针类型。
5. void 不能代表⼀个真实的数据类型
这个前⾯提到过,因为void在C语⾔中解释为空,或者⽆类型,所以它当然⽆法代表⼀个真实的数据类型了。不过我们可以对其进⾏类型转换,这样它⼜可以变成各种各样的数据类型,所以我们可以将其理解成⼀个"抽象数据类型"。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论