針對C語言中的Void意思的深究

2021-03-03 21:12:32 字數 6889 閱讀 7425

1樓:

需要說明一點:函式的返回值型別和引數型別只是在函式定義和函式宣告中需要明確規定,函式呼叫是另一碼事,不需要再寫型別,只是按照型別寫引數或取返回值就行

所以函式定義和宣告的時候,型別說明(包括void)都必須寫上,呼叫函式的時候,就不再需要寫這些了,只需要寫函式名和實際的函式引數就行

c語言中void是什麼意思

2樓:匿名使用者

void 被翻譯為"無型別",相應的void * 為"無型別指標"。常用在程式編寫中對定義函式的引數型別、返回值、函式中指標型別進行宣告。

void 的作用

1.對函式返回的限定,這種情況我們比較常見。

2.對函式引數的限定,這種情況也是比較常見的。

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

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

(2)0當函式不允許接受引數時,必須使用void限定,這就是我們所說的第二種情況。例如:int func(void)。

3樓:鄙視04號

void真正發揮的作用在於: (1) 對函式返回的限定; (2) 對函式引數的限定。

void的字面意思是「無型別」,void *則為「無型別指標」,void *可以指向任何型別的資料。

void幾乎只有「註釋」和限制程式的作用,因為從來沒有人會定義一個void變數,讓我們試著來定義:

void a;

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

規則一:如果函式沒有返回值,那麼應宣告為void型別

在c語言中,凡不加返回值型別限定的函式,就會被編譯器作為返回整型值處理。但是許多程式設計師卻誤以為其為void型別。例如:

add ( int a, int b )

int main(int argc, char* argv)

程式執行的結果為輸出:2 + 3 = 5,這說明不加返回值說明的函式的確為int函式。

規則二:如果函式無引數,那麼應宣告其引數為void。

在c++語言中宣告一個這樣的函式:

int function(void)

則進行下面的呼叫是不合法的:

function(2);

因為在c++中,函式引數為void的意思是這個函式不接受任何引數。在turbo c 2.0中編譯:

#include "stdio.h"

fun()

main()

編譯正確且輸出1,這說明,在c語言中,可以給無引數的函式傳送任意型別的引數,但是在c++編譯器中編譯同樣的**則會出錯。在c++中,不能向無引數的函式傳送任何引數,出錯提示「'fun' : function does not take 1 parameters」。

所以,無論在c還是c++中,若函式不接受任何引數,一定要指明引數為void。

定義函式

返回值 函式名(引數1,引數2,引數3,.......)

{內容}

int  sum(int a,int b)

{int c;

return c;}

其中第一個int是返回值 就是別的函式呼叫此函式時這個函式給他的一個值。

如果呼叫時不需要返回值,則函式寫為

void sum(int a,int b){....}  此時函式沒有返回值

如果不需要引數  則int sum(void){...}

此時void的意義為空,就是沒有引數的意思

如果都不要  則為void sum(void);

4樓:匿名使用者

void的意思就是樓主說的2個意思,這兩個意思都對。

void真正發揮的作用在於:

(1) 對函式返回的限定;

(2) 對函式引數的限定。

先給一個例子 定義函式

返回值 函式名(引數1,引數2,引數3,.......){內容}

int sum(int a,int b){int c;

return c;}

其中第一個int是返回值 就是別的函式呼叫此函式時這個函式給他的一個值。

如果呼叫時不需要返回值,則函式寫為

void sum(int a,int b){....} 此時函式沒有返回值

如果不需要引數 則int sum(void){...}此時void的意義為空,就是沒有引數的意思如果都不要 則為void sum(void);

5樓:匿名使用者

void是指此函式沒有返回值,而main是函式名,void main 是無返回值的主函式。

c語言是一種結構化的語言,以函式為模組,而無論程式多麼大,主函式有且只能有一個。

關於什麼時候用,這個要看你想把主函式寫到什麼位置了,無論你把主函式寫到什麼位置,c語言總是先從主函式開始執行的。

6樓:匿名使用者

void 的字面意思是「空型別」,void *則為「空型別指標」,void *可以指向任何型別的資料。

看這裡,很詳細

7樓:匿名使用者

void就無需返回值的函式型別符

8樓:善緣戀

定義的什麼 函式就返回什麼 void就是返回空 說白了 就是什麼都不返回 返回值 知道嗎

9樓:泥潭裡的金魚

void中最有用的屬"void*"這個萬能的型別定義了;可以代表任何型別,這個方便我們去寫各種介面,解耦的時候很方面將各種結構體封裝起來,不暴露給使用者:

void* func_get_info()

10樓:不典章佳元綠

【void的含義】

void的字面意思是「無型別」,void

*則為「無型別指標」,void

*可以指向任何型別的資料。

void幾乎只有「註釋」和限制程式的作用,因為從來沒有人會定義一個void變數,

void真正發揮的【作用】在於:

(1)對函式返回的限定;

(2)對函式引數的限定。

11樓:百將帥先行

1.10,void關鍵字

void有什麼好講的呢?如果你認為沒有,那就沒有;但如果你認為有,那就真的有。有點像「色即是空,空即是色」。

1.10.1,void a?

void的字面意思是「空型別」,void*則為「空型別指標」,void*可以指向任何型別的資料。void幾乎只有「註釋」和限制程式的作用,因為從來沒有人會定義一個void變數,看看下面的例子:

voida;

visualc++6.0上,這行語句編譯時會出錯,提示「illegaluseoftype'void'」。不過,即使voida的編譯不會出錯,它也沒有任何實際意義。

void真正發揮的作用在於:

(1) 對函式返回的限定;

(2) 對函式引數的限定。

眾所周知,如果指標p1和p2的型別相同,那麼我們可以直接在p1和p2間互相賦值;如果p1和p2指向不同的資料型別,則必須使用強制型別轉換運算子把賦值運算子右邊的指標型別轉換為左邊指標的型別。

例如:float *p1;

int *p2;

p1=p2;

其中p1=p2語句會編譯出錯,提示「'=':cannotconvertfrom'int*'to'float*'」,必須改為:

p1=(float*)p2;

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

void *p1;

int *p2;

p1=p2;

但這並不意味著,void*也可以無需強制型別轉換地賦給其它型別的指標。因為「空型別」可以包容「有型別」,而「有型別」則不能包容「空型別」。比如,我們可以說「男人和女人都是人」,但不能說「人是男人」或者「人是女人」。

下面的語句編譯出錯:

void *p1;

int *p2;

p2=p1;

提示「'=':cannotconvertfrom'void*'to'int*'」。

1.10.2,void修飾函式返回值和引數

【規則1-33】如果函式沒有返回值,那麼應宣告為void型別

在c語言中,凡不加返回值型別限定的函式,就會被編譯器作為返回整型值處理。但是許多程式設計師卻誤以為其為void型別。例如:

add(inta,intb)

intmain(intargc,char*argv)//甚至很多人以為main函式無返回值

//或是為void型的

程式執行的結果為輸出: 2+3=5

這說明不加返回值說明的函式的確為int函式。

因此,為了避免混亂,我們在編寫c程式時,對於任何函式都必須一個不漏地指定其型別。如果函式沒有返回值,一定要宣告為void型別。這既是程式良好可讀性的需要,也是程式設計規範性的要求。

另外,加上void型別宣告後,也可以發揮**的「自注釋」作用。所謂的**的「自注釋」即**能自己註釋自己。

【規則1-34】如果函式無引數,那麼應宣告其引數為void

在c++語言中宣告一個這樣的函式:

intfunction(void)

則進行下面的呼叫是不合法的:function(2);

因為在c++中,函式引數為void的意思是這個函式不接受任何引數。

但是在turboc2.0中編譯:

#include"stdio.h"

fun()

main()

編譯正確且輸出1,這說明,在c語言中,可以給無引數的函式傳送任意型別的引數,但是在c++編譯器中編譯同樣的**則會出錯。在c++中,不能向無引數的函式傳送任何引數,出錯提示「'fun':functiondoesnottake1parameters」。

所以,無論在c還是c++中,若函式不接受任何引數,一定要指明引數為void。1.10.3,void指標

【規則1-35】千萬小心又小心使用void指標型別。

按照ansi(americannationalstandardsinstitute)標準,不能對void指標進行演算法操作,即下列操作都是不合法的:

void*pvoid;

pvoid++;//ansi:錯誤

pvoid+=1;//ansi:錯誤

ansi標準之所以這樣認定,是因為它堅持:進行演算法操作的指標必須是確定知道其指向資料型別大小的。也就是說必須知道記憶體目的地址的確切值。

例如:int*pint;

pint++;//ansi:正確

但是大名鼎鼎的gnu(gnu'snotunix的遞迴縮寫)則不這麼認定,它指定void*的演算法操作與char*一致。因此下列語句在gnu編譯器中皆正確:

pvoid++;//gnu:正確

pvoid+=1;//gnu:正確

在實際的程式設計中,為符合ansi標準,並提高程式的可移植性,我們可以這樣編寫實現同樣功能的**:

void*pvoid;

(char*)pvoid++;//ansi:正確;gnu:正確

(char*)pvoid+=1;//ansi:錯誤;gnu:正確

gnu和ansi還有一些區別,總體而言,gnu較ansi更「開放」,提供了對更多語法的支援。但是我們在真實設計時,還是應該儘可能地符合ansi標準。

【規則1-36】如果函式的引數可以是任意型別指標,那麼應宣告其引數為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接受任意型別指標

intintarray_a[100];

memset(intarray_a,0,100*sizeof(int));//將intarray_a清0

例子:memcpy接受任意型別指標

intdestintarray_a[100],srcintarray_a[100];

//將srcintarray_a拷貝給destintarray_a

memcpy(destintarray_a,srcintarray_a,100*sizeof(int));

有趣的是,memcpy和memset函式返回的也是void*型別,標準庫函式的編寫者都不是一般人。

1.10.4,void不能代表一個真實的變數

【規則1-37】void不能代表一個真實的變數。

因為定義變數時必須分配記憶體空間,定義void型別變數,編譯器到底分配多大的記憶體呢。

下面**都企圖讓void代表一個真實的變數,因此都是錯誤的**:

voida;//錯誤

function(voida);//錯誤

void體現了一種抽象,這個世界上的變數都是「有型別」的,譬如一個人不是男人就是女人(人妖不算)。

void的出現只是為了一種抽象的需要,如果你正確地理解了物件導向中「抽象基類」的概念,也很容易理解void資料型別。正如不能給抽象基類定義一個例項,我們也不能定義一個void(讓我們類比的稱void為「抽象資料型別」)變數。

void簡單吧?到底是「色」還是「空」呢?

<<<<<<<<<<<<<,,,複製《c語言深度解剖》上的 >>>>>>>>>>>>>>>>>>>

C語言中是什麼意思,c語言中的c是什麼意思?

判斷相等的運算子。形式為a b a b可以是任意值或表示式。當a b相等時,a b為真,否則為假。是關係運算子.表示 判斷是否相等的。如 if a b 判斷a與b是否相等,如相等則為真 c語言中 是什麼意思 是關係運算子.表示 判斷是否相等的。如 if a b 判斷a與b是否相等,如相等則為真 因為...

pa在C語言中的意思,c語言中pa是啥子意思

a是一個指標 把指標a所指向的內容賦值p a為指標 a表示指標地址的內容 p a 把指標內容賦值給p 將a指向的變數的值賦給p c語言中p a是啥子意思 p 是一個結構體或者共用體型別資料的指標。p a表示訪問該指標上,名為a的資料成員。等效於 p a p是一個結構體型別的指標變數,這個結構體中有一...

C語言中的位與是什麼意思,C語言中c是什麼意思

c位,網路流行語,最早 於遊戲領域,即center,中間位置的意思。是二進位制的吧?因為二進位制 中的加法,減法,乘法,除法,還有邏輯運算,都是針對這個版 數字的二進位制位權數來進行的。比如1111111,除二,就只要將這個數的所有位數向後移以為,就是111111。牽扯到 位 的,都跟二進位制有關,...