首頁>Club>
7
回覆列表
  • 1 # 生如夏花125025241

    void的字面意思是空型別,void *的意思是空型別指標,void 不是一個真正的型別,我們在宣告變數的時候從來不會像下面這樣宣告:


    void a;


    如果我們寫了一行這樣的程式碼,某些編譯器會直接報錯,有些則不會,但也沒有任何意義。



    void真正的用途在下面兩個方面:


    對函式返回值的限定


    對函式引數的限定




    比如,函式沒有返回值,那麼函式可能會宣告成這樣:void fun(int a);


    如果函式有返回值,但是函式沒有引數,那麼函式的可能會宣告成這樣:int fun(void)。



    以上的情況都是很好理解的。下面介紹void *的一些用法。



    1. 函式可接受任意型別的指標。


    用過memset或者memcpy的細心的人會發現,在gcc中編譯類似下面的程式碼都不會有警告:


    int a;


    int *p = &a;


    memset(p, 0, 4);


    或者


    char c[4];


    char *p = c;


    memset(p, 0, 4);


    為什麼memset傳int *還是char *都沒有問題呢?我們知道不同型別間複製是要進行強制轉換的,那麼這裡為什麼不用強制型別轉換呢。我們看memset的原型會發現,memset的第一個引數就是void *。



    2. void *型別可以接受任意型別指標。


    例如:


    void *p1;


    char *p2 = “hellp”;


    p1 = p2;


    這是沒有問題的,任何型別的指標都可以直接賦值給它,無需進行強制型別轉換。但需要注意的一點是,void *的型別並不能無需型別轉換直接賦值給其他型別,比如malloc的返回值是void *,那麼我們一般這樣寫:char *p = (char *)malloc(4);



    3. void *型別不能做運算


    比如我們不要做類似這樣的操作:


    void *p;


    p++;


    說白了void並不是一個真實的變數,void可以看作一個抽象概念


    分類: C++

  • 中秋節和大豐收的關聯?
  • CAD2007裡的LI計算面積的快捷鍵不好用了,求解?