欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

void指針使用規(guī)范
void指針可以指向任意類型的數(shù)據(jù),亦即可用任意數(shù)據(jù)類型的指針對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的作用
對函數(shù)返回的限定。
對函數(shù)參數(shù)的限定。
當函數(shù)不需要返回值時,必須使用void限定。例如: void func(int, int);
當函數(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 );

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

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

2.規(guī)則二如果函數(shù)的參數(shù)可以是任意類型指針,那么應聲明其參數(shù)為void*
  典型的如內存操作函數(shù)memcpy和memset的函數(shù)原型分別為:
void*memcpy(void*dest,constvoid*src,size_tlen);  
void*memset(void*buffer,intc,size_tnum);
  這樣,任何類型的指針都可以傳入memcpy和memset中,這也真實地體現(xiàn)了內存操作函數(shù)的意義,因為它操作的對象僅僅是一片內存,而不論這片內存是什么類型。如果 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*類型,標準庫函數(shù)的編寫者是多么地富有學問??!

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

相關文章

  • C++算法學習之回溯法的應用

    C++算法學習之回溯法的應用

    這篇文章介紹了C++算法中回溯法的一些應用,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C++封裝IATHOOK類實例

    C++封裝IATHOOK類實例

    這篇文章主要介紹了C++封裝IATHOOK類的實現(xiàn)方法,對IAT的HOOK實例進行了封裝,非常具有實用價值,需要的朋友可以參考下
    2014-10-10
  • 在C語言中對utmp文件進行查找和寫入操作的函數(shù)小結

    在C語言中對utmp文件進行查找和寫入操作的函數(shù)小結

    這篇文章主要介紹了在C語言中對utmp文件進行查找和寫入操作的函數(shù)小結,包括pututline()函數(shù)和getutline()函數(shù)以及getutid()函數(shù),需要的朋友可以參考下
    2015-08-08
  • 利用Qt實現(xiàn)獲取計算機的硬件信息

    利用Qt實現(xiàn)獲取計算機的硬件信息

    在開發(fā)時,常常會需要用到計算機的相關信息。利用這些信息,我們可以開發(fā)一些輔助模塊。本文將利用Qt實現(xiàn)獲取計算機的硬件信息,感興趣的可以嘗試一下
    2022-12-12
  • C語言 實現(xiàn)N階乘的程序代碼

    C語言 實現(xiàn)N階乘的程序代碼

    本篇文章是對c語言中實現(xiàn)N階乘的程序代碼進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Qt數(shù)據(jù)庫應用之實現(xiàn)通用數(shù)據(jù)庫清理

    Qt數(shù)據(jù)庫應用之實現(xiàn)通用數(shù)據(jù)庫清理

    項目如果需要存儲很多日志記錄比如運行日志,時間長了記錄數(shù)量非常多,數(shù)據(jù)庫體積不斷增大,對應數(shù)據(jù)庫表的增刪改查的效率不斷降低,因此需要將早期的數(shù)據(jù)清理。本文將詳細介紹一下通用數(shù)據(jù)庫清理的實現(xiàn),需要的可以參考一下
    2022-02-02
  • C語言編程C++柔性數(shù)組結構示例講解

    C語言編程C++柔性數(shù)組結構示例講解

    這篇文章主要介紹了C語言編程系列中的柔性數(shù)組,文中含有詳細的示例代碼講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • C語言使用scanf連續(xù)輸入字符串出現(xiàn)的問題

    C語言使用scanf連續(xù)輸入字符串出現(xiàn)的問題

    這篇文章主要介紹了C語言使用scanf連續(xù)輸入字符串出現(xiàn)的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • C++20中的結構化綁定類型示例詳解

    C++20中的結構化綁定類型示例詳解

    這篇文章主要為大家介紹了C++20中的結構化綁定類型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • VisualStudio Community2019在安裝的過程中無法進入安裝界面的解決方法

    VisualStudio Community2019在安裝的過程中無法進入安裝界面的解決方法

    這篇文章主要介紹了VisualStudio Community2019在安裝的過程中無法進入安裝界面的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03

最新評論