C语言再学习 -- 关键字void
參看:C語(yǔ)言關(guān)鍵字
void 用途:
1、對(duì)函數(shù)返回的限定,用于強(qiáng)調(diào)函數(shù)沒有返回值。如,void func(int x);2、對(duì)函數(shù)參數(shù)的限定,用于強(qiáng)調(diào)函數(shù)沒有任何參數(shù)。如,int func(void);
3、指向void的指針。如 void *vp = NULL;
4、丟掉函數(shù)調(diào)用的返回值。如, int func(int x); ?(void)func(5);
5、(void)0,(void)1,(void *)0,(void*)0x100000
1、void
void對(duì)象的(不存在的)值不能夠以任何方式使用,也不能被顯式或隱式地轉(zhuǎn)換為任一非空類型。因?yàn)関oid表達(dá)式表示一個(gè)不存在的值,這樣的表達(dá)式只可以用在不需要值的地方,例如:作為一個(gè)表達(dá)式語(yǔ)句或作為逗號(hào)運(yùn)算符的左操作數(shù)。(《C程序設(shè)計(jì)語(yǔ)言》 附錄A.6.7)
1)不能被顯式或隱式地轉(zhuǎn)為任一非空類型
int x = 12, y = 0; y= (int)((void)x); // 錯(cuò)誤:'type cast' : cannot convert from 'void' to 'int' y= (int)((void)123);//錯(cuò)誤: 'type cast' : cannot convert from 'void' to 'int'
2)void 表達(dá)式只能用在不需要的地方
int x = 12, y = 0; (void)x;//正確:表達(dá)式語(yǔ)句 y = ((void)x, 123);//正確:逗號(hào)運(yùn)算符的左操作數(shù)
3)定義void變量
void a;//是錯(cuò)誤的,因?yàn)槎x變量時(shí)必須分配內(nèi)存空間,定義void類型變量,編譯器不知該分配多大的內(nèi)存空間。
4)將表達(dá)式強(qiáng)制轉(zhuǎn)換為void類型
define min(x,y) ({ \ typeof(x) _x = (x); \ typeof(y) _y = (y); \ (void) (&_x == &_y); \ _x < _y ? _x : _y; })
(void)(&_x == &_y);其中&_x == &_y是關(guān)系表達(dá)式,如果關(guān)系為真,則表達(dá)式的結(jié)果值為數(shù)值1;如果為假,則結(jié)果值為數(shù)值0。故而,(void)(&_x == &_y);等價(jià)于(void)0;或(void)1;
int func(int x); void func(5);
(void)func(5);在表達(dá)式語(yǔ)句中一個(gè)空的強(qiáng)制類型轉(zhuǎn)換將丟掉函數(shù)調(diào)用的返回值。
5)(void)0
標(biāo)準(zhǔn)庫(kù)頭文件:assert.h #define assert(test) ((test) ? (void)0 : _Assert(__FILE__“:”__STR(__LINE__)”” #test))
(void)0的作用相當(dāng)于函數(shù)返回類型為void限定,它僅是一個(gè)占位符表達(dá)式,什么都不做。
2、指向void的指針
指向任何類型的指針都可以轉(zhuǎn)為void *類型,且不會(huì)丟失信息。如果將結(jié)果再轉(zhuǎn)換為初始指針類型,則可以恢復(fù)初始指針。
void *vp; char *cp; vp = cp; /*指向任何類型的指針都可以轉(zhuǎn)為void *類型,且無(wú)需強(qiáng)制轉(zhuǎn)換*/ cp = (char *)vp;
但是需要注意:“空類型”可以包容“有類型”,而“有類型”則不能包容“空類型”。
void *p1; int *p2; p2 = p1; C編譯 是OK的 C++編譯出現(xiàn) 錯(cuò)誤: 從類型‘void*’到類型‘int*’的轉(zhuǎn)換無(wú)效 [-fpermissive]
1)#define NULL (void*)0
定義NULL為指向內(nèi)存位置為0的空指針。
NULL表示內(nèi)存位置0,NULL指針并不指向任何對(duì)象。因此除非是用于賦值或比較運(yùn)算,出于其他任何目的使用NULL指針都是非法的
2)將整型數(shù)值轉(zhuǎn)為指針
#define BUFFER_END 0x200000 void * b = (void *) BUFFER_END; if (b == (void *) 0x100000) b = (void *) 0xA0000;
指向特定類型的指針可以進(jìn)行算術(shù)運(yùn)算(+、-)和關(guān)系運(yùn)算(==、!=、<、>、>=、<=),空類型指針不可以。
3、void修飾函數(shù)返回值和參數(shù)
如果函數(shù)沒有返回值,那么應(yīng)聲明為 void 類型。在 C 語(yǔ)言中,凡不加返回值類型限定的函數(shù),就會(huì)被編譯器作為返回 整型值 處理,但是許多程序員卻誤認(rèn)為其為 void 類型。
#include <stdio.h>void main (void) {printf ("hello world!\n");return 0; } 編譯出現(xiàn): 警告: 在無(wú)返回值的函數(shù)中,‘return’帶返回值 [默認(rèn)啟用] #include <stdio.h>main () {printf ("hello world!\n");return 0; } 編譯OK
因此,為了避免混亂,我們?cè)诰帉?C 程序時(shí),對(duì)于任何函數(shù)都必須一個(gè)不漏地指定其類型,如果函數(shù)沒有返回值,一定要聲明為 void 類型。
再有,無(wú)論在 C 還是 C++中,若函數(shù)不接受任何參數(shù),一定要指明參數(shù)為 void。
總結(jié)
以上是生活随笔為你收集整理的C语言再学习 -- 关键字void的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 电路基础知识 -- 数模信号
- 下一篇: springcloud config配置