a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

void及void指針的含義是什么

2020-02-24 14:30:20
字體:
來源:轉載
供稿:網友

void及void指針的含義是什么?相信很多人都還是不了解的,那么我們現在就去看看void以及void指針的含義,感興趣的小伙伴們一起來看看吧。

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

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


在ANSI C標準中,不允許對void指針進行算術運算如pvoid++或pvoid+=1等,而在GNU中則允許,因為在缺省情況下,GNU認為void *與char *一樣。sizeof( *pvoid )== sizeof( char ).

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


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

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

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

2.規則二如果函數的參數可以是任意類型指針,那么應聲明其參數為void*
  典型的如內存操作函數memcpy和memset的函數原型分別為:
void*memcpy(void*dest,constvoid*src,size_tlen);??
void*memset(void*buffer,intc,size_tnum);
  這樣,任何類型的指針都可以傳入memcpy和memset中,這也真實地體現了內存操作函數的意義,因為它操作的對象僅僅是一片內存,而不論這片內存是什么類型。如果 memcpy和memset的參數類型不是void*,而是char*,那才叫真的奇怪了!這樣的memcpy和memset明顯不是一個“純粹的,脫離低級趣味的”函數!
下面的代碼執行正確:
//示例: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函數返回的也是void*類型,標準庫函數的編寫者是多么地富有學問啊!

3.規則三 void不能代表一個真實的變量
  下面代碼都企圖讓void代表一個真實的變量,因此都是錯誤的代碼:
voida;//錯誤
function(voida);//錯誤
  void體現了一種抽象,這個世界上的變量都是“有類型”的,譬如一個人不是男人就是女人(還有人妖?)。
  void的出現只是為了一種抽象的需要,如果你正確地理解了面向對象中“抽象基類”的概念,也很容易理解void數據類型。正如不能給抽象基類定義一個實例,我們也不能定義一個void(讓我們類比的稱void為“抽象數據類型”)變量。

以上就是關于void及void指針的含義是什么的內容,希望對大家的學習有所幫助,也希望大家多多支持武林技術頻道。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 日韩精品一区二区三区中文字幕 | 韩国精品视频在线观看 | 欧美电影一区 | 污网站在线播放 | 日本在线视频不卡 | 国产老女人精品毛片久久 | 二区在线视频 | 国产成人午夜片在线观看高清观看 | 国外成人在线视频 | 欧美久久一区二区三区 | 亚洲成av人片在线观看无码 | 三级在线观看视频 | 成人黄色精品 | 日本二区在线观看 | 久久久美女 | 国产超碰人人模人人爽人人添 | 日本三级全黄 | 久久久999 | 中文字幕免费 | 国产综合亚洲精品一区二 | 国产精品一区三区 | 一区二区三区精品视频 | 精品国产精品三级精品av网址 | 亚洲人成人一区二区在线观看 | 久二影院 | 国产精品久久久久久久久久三级 | 黄色99| 久久久噜噜噜www成人网 | 激情小说综合网 | 黄色一级视 | 欧美日韩在线免费观看 | 一级a性色生活片久久毛片明星 | 天堂中文字幕 | 成人看片毛片免费播放器 | 久久久噜噜噜www成人网 | 日韩欧美在线播放 | 欧美日韩国产成人在线 | 国产精品三级 | 国产在线小视频 | 91精品视频国产 | 亚洲免费成人 |