小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

【專業(yè)技術(shù)第十二講】void的妙用

 昵稱29273511 2015-12-15


存在問題:

遇到微信好友詢問關(guān)于void *的用法,這里做一個(gè)總結(jié)性的回復(fù)。


解決方案:

void的字面意思是空類型,void *的意思是空類型指針,void 不是一個(gè)真正的類型,我們?cè)诼暶髯兞康臅r(shí)候從來不會(huì)像下面這樣聲明:

void a;

如果我們寫了一行這樣的代碼,某些編譯器會(huì)直接報(bào)錯(cuò),有些則不會(huì),但也沒有任何意義。


void真正的用途在下面兩個(gè)方面:

  1. 對(duì)函數(shù)返回值的限定

  2. 對(duì)函數(shù)參數(shù)的限定



比如,函數(shù)沒有返回值,那么函數(shù)可能會(huì)聲明成這樣:void fun(int a);

如果函數(shù)有返回值,但是函數(shù)沒有參數(shù),那么函數(shù)的可能會(huì)聲明成這樣:int fun(void)。


以上的情況都是很好理解的。下面介紹void *的一些用法。


1. 函數(shù)可接受任意類型的指針。

用過memset或者memcpy的細(xì)心的人會(huì)發(fā)現(xiàn),在gcc中編譯類似下面的代碼都不會(huì)有警告:

int a;

int *p = &a;

memset(p, 0, 4);

或者

char c[4];

char *p = c;

memset(p, 0, 4);

為什么memset傳int *還是char *都沒有問題呢?我們知道不同類型間復(fù)制是要進(jìn)行強(qiáng)制轉(zhuǎn)換的,那么這里為什么不用強(qiáng)制類型轉(zhuǎn)換呢。我們看memset的原型會(huì)發(fā)現(xiàn),memset的第一個(gè)參數(shù)就是void *。


2. void *類型可以接受任意類型指針。

例如:

void *p1;

char *p2 = 'hellp';

p1 = p2;

這是沒有問題的,任何類型的指針都可以直接賦值給它,無需進(jìn)行強(qiáng)制類型轉(zhuǎn)換。但需要注意的一點(diǎn)是,void *的類型并不能無需類型轉(zhuǎn)換直接賦值給其他類型,比如malloc的返回值是void *,那么我們一般這樣寫:char *p = (char *)malloc(4);


3. void *類型不能做運(yùn)算

比如我們不要做類似這樣的操作:

void *p;

p++;

說白了void并不是一個(gè)真實(shí)的變量,void可以看作一個(gè)抽象概念。


以上說法由于C標(biāo)準(zhǔn)不同,可能有部分差異,需要特殊對(duì)待,但大體就是這樣的。


聯(lián)盟寄語:

void是指針轉(zhuǎn)化的調(diào)節(jié)器,基本上基本的數(shù)據(jù)類型的都會(huì)欺負(fù)下void,誰讓名字叫四大皆空那,但是欺負(fù)也得有欺負(fù)的規(guī)則,小伙伴一定要學(xué)會(huì)void的用法,使用起來更加靈活的欺負(fù)



聯(lián)盟推出專業(yè)技術(shù)系列,如果有編程疑惑可按照如下格式:

專業(yè)技術(shù)+個(gè)人昵稱+具體問題

輸入到微信公眾號(hào)里面,具有代表性的問題,聯(lián)盟將整理成文章發(fā)表

輸入js獲取所有的答疑釋惑文章,或者點(diǎn)擊“閱讀原文

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多