中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中void有什么用

發布時間:2022-02-19 10:56:10 來源:億速云 閱讀:495 作者:小新 欄目:開發技術

這篇文章主要介紹了C語言中void有什么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

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

void 似乎只有”注釋”和限制程序的作用,當然,這里的”注釋”不是為我們人提供注釋,而是為編譯器提供一種所謂的注釋。

C語言中void有什么用

void 的作用

  1. 對函數返回的限定,這種情況我們比較常見。
  2. 對函數參數的限定,這種情況也是比較常見的。

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

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

void 指針的使用規則

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

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

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

\2. 在 ANSI C 標準中,不允許對 void 指針進行一些算術運算如 p++ 或 p+=1 等,因為既然 void 是無類型,那么每次算術運算我們就不知道該操作幾個字節,例如 char 型操作 sizeof(char) 字節,而 int 則要操作 sizeof(int) 字節。而在 GNU 中則允許,因為在默認情況下,GNU 認為 void * 和 char * 一樣,既然是確定的,當然可以進行一些算術操作,在這里sizeof(*p)==sizeof(char)。

void 幾乎只有”注釋”和限制程序的作用,因為從來沒有人會定義一個 void 變量,讓我們試著來定義:

void a;

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

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

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

而 void * 則不同,任何類型的指針都可以直接賦值給它,無需進行強制類型轉換。

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

但這并不意味著,void * 也可以無需強制類型轉換地賦給其它類型的指針。因為”無類型”可以包容”有類型”,而”有類型”則不能包容”無類型”。

小心使用 void 指針類型:

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

void * pvoid;
pvoid++; //ANSI:錯誤
pvoid += 1; //ANSI:錯誤
//ANSI標準之所以這樣認定,是因為它堅持:進行算法操作的指針必須是確定知道其指向數據類型大小的。
//例如:
int *pint;
pint++; //ANSI:正確

pint++ 的結果是使其增大 sizeof(int)。 但是 GNU 則不這么認定,它指定 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 標準。 如果函數的參數可以是任意類型指針,那么應聲明其參數為void *。

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

典型的如內存操作函數 memcpy 和 memset 的函數原型分別為:

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

這樣,任何類型的指針都可以傳入 memcpy 和 memset 中,這也真實地體現了內存操作函數的意義,因為它操作的對象僅僅是一片內存,而不論這片內存是什么類型(參見 C 語言實現泛型編程)。如果 memcpy 和 memset 的參數類型不是 void *,而是 char *,那才叫真的奇怪了!這樣的 memcpy 和 memset 明顯不是一個”純粹的,脫離低級趣味的”函數!void 的出現只是為了一種抽象的需要,如果你正確地理解了面向對象中”抽象基類”的概念,也很容易理解 void 數據類型。正如不能給抽象基類定義一個實例,我們也不能定義一個 void(讓我們類比的稱 void 為”抽象數據類型”)變量。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“C語言中void有什么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜昌市| 宣威市| 铜川市| 栖霞市| 五指山市| 阿瓦提县| 聂拉木县| 顺昌县| 南涧| 寿宁县| 夏河县| 岳普湖县| 千阳县| 凯里市| 乐清市| 轮台县| 永济市| 周口市| 炉霍县| 巧家县| 遂宁市| 韶关市| 临湘市| 安远县| 洞口县| 广水市| 奉节县| 晋江市| 瑞安市| 宁化县| 出国| 广东省| 海门市| 前郭尔| 荆门市| 巴里| 冀州市| 井研县| 吕梁市| 丹棱县| 奇台县|