void 类型修饰符(type specifier)表示“没有值可以获得”。因此,不可以采用这个类型声明变量或常量。void 类型可以用于下面各小节所描述的目的。
void用于函数声明
没有返回值的函数,其类型为 void。例如,标准库函数 perror() 被声明为以下原型:
void perror( const char * );
下面是另一个函数原型的声明,参数列表中的关键字 void 表示该函数没有参数:
FILE *tmpfile( void );
如果尝试进行函数调用,例如采用 tmpfile("name.tmp"),则编译器会报错。如果该函数声明时参数列表中未采用 void,则 C编译器就无法获得关于该函数参数的信息,因此,无法判断 tmpfile("name.tmp") 的调用是否正确。
void类型表达式
void 类型表达式指的是没有值的表达式。例如,调用一个没有返回值的函数,就是一种 void 类型表达式:
/**
* 快速入门C语言 https://xiecoding.cn/c/
**/
char filename[] = "memo.txt";
if ( fopen( filename, "r") == NULL )
perror( filename ); // void表达式
类型转换(cast)运算(void)表达式显式地将表达式的返回值丢弃,例如,如下代码丢弃了函数返回值:
(void)printf("I don't need this function's return value!\n");
指向void的指针
一个 void* 类型的指针代表了对象的地址,但没有该对象的类型信息。这种“无数据类型”的指针主要用于声明函数,让函数可使用各种类型的指针参数,或者返回一个“多用途”的指针。
例如,标准内存管理函数:
void *malloc( size_t size );
void *realloc( void *ptr, size_t size );
void free( void *ptr );
如下例所示,可将一个 void 指针值赋值给另一个对象指针类型,反之亦可,这都不需要进行显式的类型转换。
演示 void 类型的用法:
/**
* 快速入门C语言 https://xiecoding.cn/c/
**/
#include
#include
#include
// void srand( unsigned int seed );
// int rand( void );
// void *malloc( size_t size );
// void free( void *ptr );
// void exit( int status };
enum { ARR_LEN = 100 };
int main ()
{
int i, *pNumbers = (int*)malloc(ARR_LEN * sizeof(int)); //获得相同的存储空间
if( pNumbers == NULL )
{
fprintf(stderr,"Insufficient memory.\n");
exit(1);
}
srand((unsigned)time(NULL)); // 初始化随机数产生器
for ( i=0; i < ARR_LEN; ++i )
pNumbers[i] = rand() % 10000; // 存储一些随机数
printf("\n%d random numbers between 0 and 0000:\n", ARR_LEN);
for ( i=0; i< ARR_LEN; ++i ) // 循环输出
{
printf("%6d",pNumbers[i]); // 每次循环输出一个数字
if ( i % 10 == 9) putchar( '\n'); // 每10个数字换一行
}
free( pNumbers ); // 释放存储空间
return 0;
}
运行结果为:
100 random numbers between 0 and 0000:
3942 1520 4445 3651 5294 620 627 7532 7783 6534
4793 6107 5841 7211 6188 285 1050 3527 1268 2137
7737 9567 9114 2357 1309 8124 7930 9724 9942 1625
4073 3870 1794 5632 7945 856 3723 6191 9434 2405
7855 3120 6451 8469 3520 6185 3873 8718 5180 738
4751 3872 6992 8965 2615 2477 7657 5819 3064 1257
235 3444 537 2334 6102 1942 7372 5011 8789 6619
9990 3694 8153 1684 3135 7959 4886 1027 3173 6976
6891 2791 4166 5794 5576 6697 8141 4201 1691 5287
7932 1810 4332 190 5532 9284 2266 2445 4321 6765