請問 void func() 和 void* func()這兩個函式有什麼不同? 如果我有一個 void* var的變數, 那麼 var = (void*)func()結果會是如何?
2007-07-12 12:10:51 · 2 個解答 · 發問者 志銘 4 in 電腦與網際網路 ➔ 程式設計
另外, void*是可以當作接受任何型態(例: int*,long*)回傳的意思嗎?
2007-07-12 12:28:02 · update #1
首先 void 表示「無效」或是「無意義」的意思。例如:
#include
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
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 指標取得所指向記憶體內的值,必須透過轉型(也就是明白告訴編譯器,從指向的記憶體位址開始起算,要以多大的「記憶窗框」規劃)方得使用。
2007-07-12 16:46:52 · answer #1 · answered by 淡藍色 5 · 0⤊ 0⤋
void 空的,空無所有的
沒有回傳值,要回傳什麼呢
2007-07-12 13:04:09 · answer #2 · answered by ? 3 · 0⤊ 0⤋