最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解void以及void指針的含義

 更新時間:2013年05月08日 11:41:00   作者:  
本篇文章對小編void以及void指針的含義進(jìn)行了詳細(xì)的分析和介紹。需要的朋友參考下

void的含義
void即“無類型”,void *則為“無類型指針”,可以指向任何數(shù)據(jù)類型。

void指針使用規(guī)范
void指針可以指向任意類型的數(shù)據(jù),亦即可用任意數(shù)據(jù)類型的指針對void指針賦值。例如:
int *pint;
void *pvoid;
pvoid = pint; /* 不過不能 pint = pvoid; */
如果要將pvoid賦給其他類型指針,則需要強(qiáng)制類型轉(zhuǎn)換如:pint = (int *)pvoid;


在ANSI C標(biāo)準(zhǔn)中,不允許對void指針進(jìn)行算術(shù)運(yùn)算如pvoid++或pvoid+=1等,而在GNU中則允許,因?yàn)樵谌笔∏闆r下,GNU認(rèn)為void *與char *一樣。sizeof( *pvoid )== sizeof( char ).

void的作用
對函數(shù)返回的限定。
對函數(shù)參數(shù)的限定。
當(dāng)函數(shù)不需要返回值時,必須使用void限定。例如: void func(int, int);
當(dāng)函數(shù)不允許接受參數(shù)時,必須使用void限定。例如: int func(void)。


由于void指針可以指向任意類型的數(shù)據(jù),亦即可用任意數(shù)據(jù)類型的指針對void指針賦值,因此還可以用void指針來作為函數(shù)形參,這樣函數(shù)就可以接受任意數(shù)據(jù)類型的指針作為參數(shù)。例如:
void * memcpy( void *dest, const void *src, size_t len );
void * memset( void * buffer, int c, size_t num );

許多初學(xué)者對C/C++語言中的void及void指針類型不甚理解,因此在使用上出現(xiàn)了一些錯誤。本文將對void關(guān)鍵字的深刻含義進(jìn)行解說,下面詳述void及void指針類型的使用方法與技巧。

1.規(guī)則小心使用void指針類型
  按照ANSI(AmericanNationalStandardsInstitute)標(biāo)準(zhǔn),不能對void指針進(jìn)行算法操作,即下列操作都是不合法的:
void*pvoid;
pvoid++;//ANSI:錯誤
pvoid+=1;//ANSI:錯誤
//ANSI標(biāo)準(zhǔn)之所以這樣認(rèn)定,是因?yàn)樗鼒?jiān)持:進(jìn)行算法操作的指針必須是確定知道其指向數(shù)據(jù)類型大小的。
//例如:
int*pint;
pint++;//ANSI:正確
  pint++的結(jié)果是使其增大sizeof(int)。
  但是大名鼎鼎的GNU(GNU'sNotUnix的縮寫)則不這么認(rèn)定,它指定void*的算法操作與char*一致。
因此下列語句在GNU編譯器中皆正確:
pvoid++;//GNU:正確
pvoid+=1;//GNU:正確
  pvoid++的執(zhí)行結(jié)果是其增大了1。
  在實(shí)際的程序設(shè)計(jì)中,為迎合ANSI標(biāo)準(zhǔn),并提高程序的可移植性,我們可以這樣編寫實(shí)現(xiàn)同樣功能的代碼:
void*pvoid;
(char*)pvoid++;//ANSI:正確;GNU:正確
(char*)pvoid+=1;//ANSI:錯誤;GNU:正確
  GNU和ANSI還有一些區(qū)別,總體而言,GNU較ANSI更“開放”,提供了對更多語法的支持。但是我們在真實(shí)設(shè)計(jì)時,還是應(yīng)該盡可能地迎合ANSI標(biāo)準(zhǔn)。

2.規(guī)則二如果函數(shù)的參數(shù)可以是任意類型指針,那么應(yīng)聲明其參數(shù)為void*
  典型的如內(nèi)存操作函數(shù)memcpy和memset的函數(shù)原型分別為:
void*memcpy(void*dest,constvoid*src,size_tlen);  
void*memset(void*buffer,intc,size_tnum);
  這樣,任何類型的指針都可以傳入memcpy和memset中,這也真實(shí)地體現(xiàn)了內(nèi)存操作函數(shù)的意義,因?yàn)樗僮鞯膶ο髢H僅是一片內(nèi)存,而不論這片內(nèi)存是什么類型。如果 memcpy和memset的參數(shù)類型不是void*,而是char*,那才叫真的奇怪了!這樣的memcpy和memset明顯不是一個“純粹的,脫離低級趣味的”函數(shù)!
下面的代碼執(zhí)行正確:
//示例:memset接受任意類型指針
int  intarray[100];
memset(intarray,0,100*sizeof(int));//將intarray清0
//示例:memcpy接受任意類型指針
int  intarray1[100],  intarray2[100];
memcpy(intarray1,intarray2,100*sizeof(int));//將intarray2拷貝給intarray1
  有趣的是,memcpy和memset函數(shù)返回的也是void*類型,標(biāo)準(zhǔn)庫函數(shù)的編寫者是多么地富有學(xué)問??!

3.規(guī)則三 void不能代表一個真實(shí)的變量
  下面代碼都企圖讓void代表一個真實(shí)的變量,因此都是錯誤的代碼:
voida;//錯誤
function(voida);//錯誤
  void體現(xiàn)了一種抽象,這個世界上的變量都是“有類型”的,譬如一個人不是男人就是女人(還有人妖?)。
  void的出現(xiàn)只是為了一種抽象的需要,如果你正確地理解了面向?qū)ο笾小俺橄蠡悺钡母拍睿埠苋菀桌斫鈜oid數(shù)據(jù)類型。正如不能給抽象基類定義一個實(shí)例,我們也不能定義一個void(讓我們類比的稱void為“抽象數(shù)據(jù)類型”)變量。

相關(guān)文章

  • 深入理解c語言數(shù)組

    深入理解c語言數(shù)組

    這篇文章主要介紹了c語言數(shù)組,有需要的朋友可以參考一下
    2013-12-12
  • C語言new操作的安全性分析

    C語言new操作的安全性分析

    這篇文章主要介紹了C語言new操作的安全性分析,需要的朋友可以參考下
    2014-07-07
  • C++結(jié)構(gòu)體數(shù)組詳細(xì)解析

    C++結(jié)構(gòu)體數(shù)組詳細(xì)解析

    定義結(jié)構(gòu)體數(shù)組和定義結(jié)構(gòu)體變量類似,定義結(jié)構(gòu)體數(shù)組時只需聲明其為數(shù)組即可
    2013-10-10
  • C++異步數(shù)據(jù)交換實(shí)現(xiàn)方法介紹

    C++異步數(shù)據(jù)交換實(shí)現(xiàn)方法介紹

    這篇文章主要介紹了C++異步數(shù)據(jù)交換實(shí)現(xiàn)方法,異步數(shù)據(jù)交換,除了阻塞函數(shù) send() 和 recv() 之外,Boost.MPI 還支持與成員函數(shù) isend() 和 irecv() 的異步數(shù)據(jù)交換
    2022-11-11
  • C語言中volatile關(guān)鍵字的作用及說明

    C語言中volatile關(guān)鍵字的作用及說明

    文中主要介紹了C語言中volatile關(guān)鍵字的含義和使用場景,volatile是一個類型修飾符,主要用來修飾被不同線程訪問和修改的變量,它的作用是防止編譯器對代碼進(jìn)行優(yōu)化,確保每次直接讀取原始內(nèi)存地址的值
    2024-10-10
  • linux使用gcc編譯c語言共享庫步驟

    linux使用gcc編譯c語言共享庫步驟

    這篇文章主要介紹了在linux中使用gcc編譯c語言共享庫的步驟,大家參考使用吧
    2014-01-01
  • vc++ 監(jiān)控指定路徑下文件變化實(shí)現(xiàn)代碼

    vc++ 監(jiān)控指定路徑下文件變化實(shí)現(xiàn)代碼

    這篇文章主要介紹了vc++ 監(jiān)控指定路徑下文件變化實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2019-04-04
  • 詳解為什么指針被譽(yù)為C語言靈魂

    詳解為什么指針被譽(yù)為C語言靈魂

    說到指針,就不可能脫離開內(nèi)存,學(xué)會指針的人分為兩種,一種是不了解內(nèi)存模型,另外一種則是了解。不了解的對指針的理解就停留在“指針就是變量的地址”這句話,會比較害怕使用指針,特別是各種高級操作。本文將帶你詳細(xì)了解C語言指針
    2021-06-06
  • C語言實(shí)現(xiàn)二叉樹的基本操作

    C語言實(shí)現(xiàn)二叉樹的基本操作

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)二叉樹的基本操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • ReSharper 的安裝使用詳細(xì)教程

    ReSharper 的安裝使用詳細(xì)教程

    resharper安裝教程是關(guān)于vs2012一個非常好用的插件的安裝教程,建議大家嘗試安裝,今天通過本教程幫助大家學(xué)習(xí)ReSharper 的安裝使用詳細(xì)教程,感興趣的朋友一起看看吧
    2021-06-06

最新評論

无锡市| 祁东县| 平邑县| 丹东市| 密山市| 墨江| 内江市| 衡阳市| 新干县| 红桥区| 玉树县| 东阿县| 城市| 扎兰屯市| 江口县| 霞浦县| 甘洛县| 永德县| 和政县| 台中县| 苗栗县| 南涧| 和政县| 名山县| 仁寿县| 连州市| 永年县| 仁布县| 绵竹市| 怀安县| 格尔木市| 永兴县| 昌黎县| 花垣县| 措勤县| 潞城市| 福州市| 左贡县| 玉树县| 调兵山市| 南木林县|