C语言中void常用来修饰函数的返回值和参数:
- 如果函数没有返回值,那么应该将其声明为void
- 如果函数没有参数,应该将其声明为void
#include<stdio.h>
f(){}
int main(){
int i = f(1,2,3);//能编译通过,在C语言,对函数的定义可以不写参数和返回值,这种情况函数默认返回的是int,可以接受任意参数
return 0;
}
不存在void变量
在C语言中,没有定义void究竟是多大内存的别名,也就是没有void标尺,无法在内存中裁剪出void对应的变量
#include<stdio.h>
int main() {
void var; //error
void array[5]; //error
void *pv;
return 0;
}
void指针
C语言中规定只有相同类型的指针才可以相互赋值,void*
指针作为左值用于接收任意类型的指针,void*
指针作为右值使用时需要进行强制类型转换。
int *pI = (int *)malloc(sizeof(int));
char *pC = (char *)malloc(sizeof(char));
void *p = NULL;
int *pni = NULL;
char *pnc = NULL:
p = pI; //ok
pni = p; //error
p = pC; //ok
pnc = p; //error
void的意义
ANSI C是标准C语言的规范,扩展C在ANSI C的基础上进行了扩充。
下面的代码在ANSI C编译器上无法通过编译,但是对于支持GNU标准的gcc编译器而言是合法的。
#include<stdio.h>
int main()
{
printf("%d\n", sizeof(void));
return 0;
}
gcc编译,输出结果是1。
示例:通过 void*
实现Memset函数
#include <stdio.h>
void MemSet(void* src, int length, unsigned char n)
{
unsigned char* p = (unsigned char*)src;
int i = 0;
for(i=0; i<length; i++)
{
p[i] = n;
}
}
int main()
{
int a[5];
int i = 0;
MemSet(a, sizeof(a), 0);
for(i=0; i<5; i++)
{
printf("%d\n", a[i]);
}
return 0;
}
运行结果: