志銘
Lv 4
志銘 發問時間: 電腦與網際網路程式設計 · 1 0 年前

C語言程式指標問題

請問 void func() 和 void* func()這兩個函式有什麼不同? 如果我有一個 void* var的變數, 那麼 var = (void*)func()結果會是如何?

已更新項目:

另外, void*是可以當作接受任何型態(例: int*,long*)回傳的意思嗎?

2 個解答

評分
  • 1 0 年前
    最佳解答

    首先 void 表示「無效」或是「無意義」的意思。例如:

    #include <stdio.h>

    int main(int argc, char* argv[])

    {

    int i,j,k=0;

    printf("k=%d\n",k);

    (void) i; /*Make compiler happy...*/

    (void) j; /*Make compiler happy...*/

    return 0;

    }

    程式碼宣告了 i,j,k 三個變數,但是只有用到 k;編譯器在編譯時會發出警告(Wraning)提醒您未使用到 i 與 j 兩個變數。如果您要排除這些警告,又不想刪去 i 與 j 宣告(可能將來馬上就會撰寫相關程式碼),您可以 (void) i;(void) j; 陳述,告訴編譯器 i 與 j 當下無意義,以排除編譯器警告。

    由上述可知 void func() 所指的 void 正是回傳值「無意義」的意思,函數主體內要強制返回時,只需要下達 return; 陳述即可。

    而 void* func() 表示回傳指標所指向的內容無意義,其實就是表示指向的記憶體「型態未定」的意思,只知道有個指標指向此處,但是尚且不知道以何種型態規劃。例如:

    #include <stdio.h>

    void* func(int* i, float* f)

    {

    if(*i > *f) return i; else return f;

    }

    int main(int argc, char* argv[])

    {

    int i;

    float f;

    void* p;

    i=1;f=2.0; p=func(&i,&f); /*這裡可以預期 p 會指向 f*/;

    /*將 p 轉型成 float 指標,才能將其所指向的記憶體規劃為 float 型態*/

    printf("f=%4.4f\n",*((float*) p));

    i=2;f=1.0; p=func(&i,&f); /*這裡可以預期 p 會指向 i*/;

    /*將 p 轉型成 int 指標,才能將其所指向的記憶體規劃為 int 型態*/

    printf("i=%4.4d\n",*((int*) p));

    return 0;

    }

    由上述程式可以窺探,void* 就只是指標,一般化的指標,也就是說任何型態的指標都可以指定給 void 指標變數。而要使用 void 指標取得所指向記憶體內的值,必須透過轉型(也就是明白告訴編譯器,從指向的記憶體位址開始起算,要以多大的「記憶窗框」規劃)方得使用。

    參考資料:
  • 1 0 年前

    void 空的,空無所有的

    沒有回傳值,要回傳什麼呢

還有問題?馬上發問,尋求解答。