久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      C 語言中 void* 詳解及應(yīng)用

      void 在英文中作為名詞的解釋為 “空虛、空間、空隙”,而在 C 語言中,void 被翻譯為“無類型”,相應(yīng)的void * 為無類型指針”。

      void 似乎只有”注釋”和限制程序的作用,當(dāng)然,這里的”注釋”不是為我們?nèi)颂峁┳⑨?,而是為編譯器提供一種所謂的注釋。


      void 的作用

      1.對函數(shù)返回的限定,這種情況我們比較常見。

      2.對函數(shù)參數(shù)的限定,這種情況也是比較常見的。

      一般我們常見的就是這兩種情況:

      • 當(dāng)函數(shù)不需要返回值值時(shí),必須使用void限定,這就是我們所說的第一種情況。例如:void func(int a,char *b)。
      • 當(dāng)函數(shù)不允許接受參數(shù)時(shí),必須使用void限定,這就是我們所說的第二種情況。例如:int func(void)。

      void 指針的使用規(guī)則

      1. void 指針可以指向任意類型的數(shù)據(jù),就是說可以用任意類型的指針對 void 指針對 void 指針賦值。例如:

      int *a;  void *p;  p=a;

      如果要將 void 指針 p 賦給其他類型的指針,則需要強(qiáng)制類型轉(zhuǎn)換,就本例而言:a=(int *)p。在內(nèi)存的分配中我們可以見到 void 指針使用:內(nèi)存分配函數(shù) malloc 函數(shù)返回的指針就是 void * 型,用戶在使用這個(gè)指針的時(shí)候,要進(jìn)行強(qiáng)制類型轉(zhuǎn)換,也就是顯式說明該指針指向的內(nèi)存中是存放的什么類型的數(shù)據(jù) (int *)malloc(1024) 表示強(qiáng)制規(guī)定 malloc 返回的 void* 指針指向的內(nèi)存中存放的是一個(gè)個(gè)的 int 型數(shù)據(jù)。

      2. 在 ANSI C 標(biāo)準(zhǔn)中,不允許對 void 指針進(jìn)行一些算術(shù)運(yùn)算如 p++ 或 p+=1 等,因?yàn)榧热?void 是無類型,那么每次算術(shù)運(yùn)算我們就不知道該操作幾個(gè)字節(jié),例如 char 型操作 sizeof(char) 字節(jié),而 int 則要操作 sizeof(int) 字節(jié)。而在 GNU 中則允許,因?yàn)樵谌笔∏闆r下,GNU 認(rèn)為 void * 和 char * 一樣,既然是確定的,當(dāng)然可以進(jìn)行一些算術(shù)操作,在這里sizeof(*p)==sizeof(char)。

      void 幾乎只有”注釋”和限制程序的作用,因?yàn)閺膩頉]有人會(huì)定義一個(gè) void 變量,讓我們試著來定義:

      void a;

      這行語句編譯時(shí)會(huì)出錯(cuò),提示“illegal use of type ‘void'”。即使 void a 的編譯不會(huì)出錯(cuò),它也沒有任何實(shí)際意義。

      眾所周知,如果指針 p1 和 p2 的類型相同,那么我們可以直接在 p1 和 p2 間互相賦值;如果 p1 和 p2 指向不同的數(shù)據(jù)類型,則必須使用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符把賦值運(yùn)算符右邊的指針類型轉(zhuǎn)換為左邊指針的類型。

      float *p1;  int *p2;  p1 = p2;  //其中p1 = p2語句會(huì)編譯出錯(cuò),  //提示“'=' : cannot convert from 'int *' to 'float *'”,必須改為:  p1 = (float *)p2;

      而 void * 則不同,任何類型的指針都可以直接賦值給它,無需進(jìn)行強(qiáng)制類型轉(zhuǎn)換。

      void *p1;  int *p2;  p1 = p2;

      但這并不意味著,void * 也可以無需強(qiáng)制類型轉(zhuǎn)換地賦給其它類型的指針。因?yàn)?#8221;無類型”可以包容”有類型”,而”有類型”則不能包容”無類型”。

      小心使用 void 指針類型:

      按照 ANSI(American National Standards Institute) 標(biāo)準(zhǔn),不能對 void 指針進(jìn)行算法操作,即下列操作都是不合法的:

      void * pvoid;  pvoid++; //ANSI:錯(cuò)誤  pvoid += 1; //ANSI:錯(cuò)誤  //ANSI標(biāo)準(zhǔn)之所以這樣認(rèn)定,是因?yàn)樗鼒?jiān)持:進(jìn)行算法操作的指針必須是確定知道其指向數(shù)據(jù)類型大小的。  //例如:  int *pint;  pint++; //ANSI:正確

      pint++ 的結(jié)果是使其增大 sizeof(int)。

      但是 GNU 則不這么認(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:錯(cuò)誤;GNU:正確  (char *)pvoid += 1; //ANSI:錯(cuò)誤;GNU:正確

      GNU 和 ANSI 還有一些區(qū)別,總體而言,GNU 較 ANSI 更”開放”,提供了對更多語法的支持。但是我們在真實(shí)設(shè)計(jì)時(shí),還是應(yīng)該盡可能地迎合 ANSI 標(biāo)準(zhǔn)。 如果函數(shù)的參數(shù)可以是任意類型指針,那么應(yīng)聲明其參數(shù)為void *。

      注:void 指針可以任意類型的數(shù)據(jù),可以在程序中給我們帶來一些好處,函數(shù)中形為指針類型時(shí),我們可以將其定義為 void 指針,這樣函數(shù)就可以接受任意類型的指針。如:

      典型的如內(nèi)存操作函數(shù) memcpy 和 memset 的函數(shù)原型分別為:

      void * memcpy(void *dest, const void *src, size_t len);  void * memset ( void * buffer, int c, size_t num );

      這樣,任何類型的指針都可以傳入 memcpy 和 memset 中,這也真實(shí)地體現(xiàn)了內(nèi)存操作函數(shù)的意義,因?yàn)樗僮鞯膶ο髢H僅是一片內(nèi)存,而不論這片內(nèi)存是什么類型(參見 C 語言實(shí)現(xiàn)泛型編程)。如果 memcpy 和 memset 的參數(shù)類型不是 void *,而是 char *,那才叫真的奇怪了!這樣的 memcpy 和 memset 明顯不是一個(gè)”純粹的,脫離低級趣味的”函數(shù)!void 的出現(xiàn)只是為了一種抽象的需要,如果你正確地理解了面向?qū)ο笾?#8221;抽象基類”的概念,也很容易理解 void 數(shù)據(jù)類型。正如不能給抽象基類定義一個(gè)實(shí)例,我們也不能定義一個(gè) void(讓我們類比的稱 void 為”抽象數(shù)據(jù)類型”)變量。

      原文地址:https://www.cnblogs.com/wuyudong/p/c-void-point.html

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號