C++中,void的意思是什麼?

請問C++中void的意思是什麼?

用途如何?

How to use it?

有什麼限制嗎?

3 個解答

評分
  • 1 0 年前
    最佳解答

    (1) 承繼自 C 語言,C++ 對 void 的解釋沒有改變。void 是指「無效」或「無意義」的意思,您無法使用 void 型態來宣告任何變數(癥結在於無法確知將要使用的記憶體大小為何,編譯器無法計算這個變數到底佔多大空間)。

    (2) 既然 C/C++ 為嚴格型態檢查的語言,那當初 C 語言為什麼要設計這種「無效」或「無意義」的型態呢?相信您一定認同在數學上所謂的函數,一定都會有一個值域,例如,f : A→B,記為 f(A)=B。但是很多時候,副程式(Sub-routine)只是為了降低重覆性的程式碼撰寫工作,在處理程序中並不會有最終所謂函數「值域」的產物出現,故「回傳值」就變得沒有意義了。例如 printf() 函數於 stdio.h 的宣告:

      void printf(const char* fmt,...);

    主要通知編譯器 printf 的回傳值無意義而已。這是其中一個讓 void 為有效陳述的樣態。此外,假設您宣告了兩個變數,例如:

      int i, j;

    而整體程式碼只用到 i,尚未撰寫到與 j 相關的程式碼,那麼 j 顯然在當下是多餘的變數,在編譯時期,編譯器發現這點,會提示您類似 Unreferenced local variable(未引用的區域變數) 的警告訊息。如果您確信將來一定會用到 j,不想取消對 j 的宣告,您可以有兩個做法:

      j = j; /*1*/

      (void) j; /*2*/

    使用 /*1*/ 較笨的編譯器會產生出應對的微指令碼,徒增執行程式的大小;使用 /*2*/ 通知編譯器 j 暫時無意義,這樣一來既不會產生多餘的程式碼,對於編譯器而言也算對於 j 的引用(雖然是無效引用 ^^") 而避免警告訊息的出現。

    (3) 對於 void 的應用,多數發生在指標上面,淡藍色覺得這是 C 作者對指標的處理,給了 C 程式設計師最大的方便、最大的彈性與最大的想像空間。void* 稱為一般性指標,何謂「一般性」?其實就只是描述「這只是一個指標」的抽象概念(其指向的位置無實際意義的意思)。例如:

      void* p;

    上述宣告 p 為一個指標,而且意義就是著重在「指標」而非其所指向記憶體的型態。這句話聽來很玄,其實說穿了的實際意義就是任何型態的指標都可以指定給 p,這也就剛剛所描述的「一般性」:

      char buffer[100];

      void* x=buffer;

    buffer 由宣告上得知是佔有 100 bytes 的具名陣列,但就 x 這個 void 指標的觀點,它只存放著 buffer 的起始位置(也就是指向 buffer),別無其他意義(就連 char 象徵意義都沒有):

       ︱﹊﹊↓buffer

    |…|x|…||||||(共100bytes)||||||…|

    而程式碼:

      int* ia=(int*) x;

    將一般性指標轉型成 int 指標交付給 ia,表示除了「指標」概念之外,還加註了 "int" 這個型態的概念。這意味什麼呢?假設一個 int 佔據 4 bytes,那麼過 ia 指標的規劃,原來 buffer 的空間可被規劃成 25 個,每個佔 4 bytes 大小的 int 陣列。當然,您可以說:

      int* ia=(int*) buffer;

    直接將 buffer 的起始位置轉型成 int 指標交付 ia 即可,何必託付 x 這個一般性指標?淡藍色覺得倘若您能產生這樣一個問題,那麼 void 指標就不足為奇了!您應該就能接受「一般性指標」的概念了:

      ((float*) x)[1]=1.0; /*將 x 所指向的位置當做 float 陣列使用*/

      ((long*) x)[3]=10; /*將 x 所指向的位置當做 long 陣列使用*/

      ((struct Programmer*) x)->name="淡藍色"; /*將 x 所指向的位置當做結構使用*/

    void 指標非得透過轉型,使得賦予所指向的位置將以何型態呈現(亦即以多大的記憶體空間規劃),任何指標的偏移量計算才有實質意義,例如:

      int array[10];

      void* p=i;

      p[1]=1;

    因為是一般性指標,無法精確計算指標偏移量,即便是 p 取得 array 這個 int 陣列的起始位置,p[1]=1; 【也就是 *(p+1)=1;】仍舊是無效陳述,無法表達 array[1]=1; 的邏輯意義。

    (但願上述文字能解答您的疑惑)

    2007-07-19 07:12:46 補充:

    有的時候,C/C++ 的函數不像數學函數那樣有明確的定義域,那麼參數就沒有存在的必要了,例如 rand() 函數於 stdlib.h 中的宣告:

      int rand(void);

    其中參數列的 void 主要通知編譯器 rand 函數的參數列無意義(也就是不需要輸入的參數的意思)。

    參考資料: 無, 無
  • 1 0 年前

    兩位都回答得很詳細

    我不知道選誰為Best Answer

    所以就投票吧

    謝謝

  • 1 0 年前

    如果再function前面有一個void的話

    就代表這個函式沒有任何的傳回值

    void main(){ //前面是void代表這個函式沒有傳回值

    cout << " hello!!" << endl;

    }

    而如果函式有傳回值的時候 前面就會有傳回值的類型 如int、float

    int plus(int,int); //前面有int代表有傳回一個int型態的值

    void main(){

    int a,b,c;

    c = plus(a,b);

    cout << "c是a、b輸入plus函式的傳回值:" << c << endl;

    }

    int plus(int a,int b){

    return a+b; //傳回a+b的結果,型態是int

    }

    參考資料: 自己的經驗
還有問題?馬上發問,尋求解答。