### C语言关键字浅析系列 ###
### ISO/ANSI C 关键字 ###
void在英文中的意思是“无效的;太空;空的”,C语言中的void想表达的大概是最后这层意思,即空的
void有可能是你接触C语言伊始最早接触到的关键字之一(只是有可能,因为主函数可以没有void字样)
不过确实void将是你后面的编程之路中非常常用的一个关键字,包括在C++、java和C#等其他高级编程语言中都是这样
void的作用是:
在程序中表示一种“没有值可以用来获得”的意象。
1、扎堆的void
void估计最常见之处就是有函数的地方了,对于无参数返回的函数,我们一般就用void表示它的类型:
int getMax(int a, int b); /* 这是需要有返回值的函数 */
void addToList(double df); /* 这是不需要有返回值的函数 */
void insertIntoDatabase(); /* 函数没有参数的时候经常看到这样的写法,小括号内什么都没有 */
void insert(void); /* 其实上述写法是这种的省略 */
bool deleteTable(void); /* 这是有返回值没有参数的情况 */
有时候学习者会有这样的疑惑:void函数什么也不返回,其是不是没有什么意义?
事实恰好相反!void函数在很多源程序中被大量使用,我写过的和我见过的源程序中,void函数数量几乎超出了有返回值函数的很多倍
虽然void函数什么也不返回,但函数的设计思想是什么?封装啊。很多void函数,我们其实把它们是当做一组规定动作,方便我们在其他的程序中直接调用,比如数据库中的增删改查动作,没有函数的情况下,我们只能在程序每个需要增删改查的地方复制粘贴增删改查的代码,但引入函数的概念后,我们只需要在主程序中调用增删改查的函数,无非就是再给它几个参数,函数们就乖乖地按要求做完事了
但很多规定动作并不需要一个特定的返回值,所以void函数由此被广泛应用:
void insert(){} /* 向数据库的一个表插入一个数据项,不需要返回什么 */
void button_Click(){} /* 按钮控件的点击事件,不需要返回什么 */
void launchMessage(){} /* UDP数据包的发送,不需要返回什么 */
void count_Thread(){} /* 子进程的委托函数,不需要返回什么 */
这下我们就能理解很多C程序中的main函数的格式了,常见的有下面这些:
int main(void){ /* main函数的小括号内把void写上的情况,表示main函数没有参数 */
return 0; /* C Primer Plus中就用了这种写法 */
}
int main(){ /* 这种情况也很常见,省略void表示main函数没有参数 */
return 0;
}
main(){ /* 这种省略int的写法不多了,但编译器会默认为int的,上述三种情况如果缺省了return 0,编译器会补充上的 */
return 0;
}
void main() /* 这种写法在C语言中不太接地气,但在C++中可以成功运行,C99标准开始规定用int main形式, */
{} /* 所以请放弃在C编程中用这种main函数写法 */
2、void表达式
居然还有没有值的表达式,刚听到这个概念的时候觉得挺新奇的,但定睛一看,原来是老熟人
比如最常见的,调用void函数的语句,就是一个没有值的void表达式:
void insert(int a){} /* 把整数插入数组的函数 */
int main(void)
{
insert(3); /* 这就是void表达式,算是老熟人了 */
(void)insert(3); /* 这叫显式地把函数的返回值丢弃了,其实本来也没有返回值,不过听这意思就是反正能丢 */
return 0;
}
3、void指针
熟人也有你不熟的一面
比如void类型的指针,说不定你都没听过,都void了还能指针呢,这一听就是大神级的操作
Internet另一端的某大神是这样说的:void*类型的指针,只代表了对象的地址,但没有该对象的类型信息。
明白了……这就叫单身久了,大街上随便找一个对象,类型都不管了,可不像int*和char*那种妖艳jian货还有类型要求
不过这么神奇的存在,要怎么使用?通常,void指针用在函数中:
void free(void *ptr){} /* 函数的参数是void指针类型,使得该函数能使用多种类型的指针参数 */
void *malloc(){size_t size}{} /* 函数类型是void指针类型的,使得函数能返回多种类型的指针参数 */
void *realloc(void *ptr, size_t size){} /* 这就叫放飞自我了,通吃 */
——参考《C Primer Plus第五版》