麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > 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指針的含義是什么的內容,希望對大家的學習有所幫助,也希望大家多多支持武林技術頻道。

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

圖片精選

主站蜘蛛池模板: 国产日韩免费观看 | 在线天堂中文字幕 | 香蕉成人在线视频 | 国产成人高潮免费观看精品 | 神马久久蜜桃 | 视频一区 在线 | 久久精品在线免费观看 | 国产精品片一区二区三区 | 成人在线视频免费观看 | 一区二区三区日本在线观看 | 污污网站入口 | 久久久久免费精品国产小说色大师 | 黄色7777| 日韩高清影视 | 欧美日韩大片在线观看 | 久草手机视频在线观看 | 亚洲欧洲av在线 | 国外成人在线视频 | 久久av一区二区 | 一起草av在线 | 久久久久久久一区 | 国产成人在线观看网站 | 久久成人免费网站 | 国产一区二区精品91 | av日韩一区二区三区 | 国产精品视频一区二区三区四 | 久久亚洲线观看视频 | www.17c亚洲蜜桃| 茄子福利视频 | 成人短视频在线观看免费 | 成人一级视频在线观看 | 天天草天天干天天射 | 少妇一级淫片免费放正片 | 欧美激情精品久久久久久黑人 | 92看片淫黄大片一级 | 曰韩黄色片 | 免费a级网站 | 精品一区二区三区欧美 | 国产精品观看在线亚洲人成网 | 亚洲成a| 久久久久久久久淑女av国产精品 |