void的字面意思是“無類型”,void *則為“無類型指針”,void *可以指向任何類型的數(shù)據(jù)。
創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站制作、網(wǎng)站建設與策劃設計,昌圖網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設十多年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:昌圖等地區(qū)。昌圖做網(wǎng)站價格咨詢:18982081108
void真正發(fā)揮的作用在于:
(1) 對函數(shù)返回的限定;
(2) 對函數(shù)參數(shù)的限定。
轉換運算符把賦值運算符右邊的指針類型轉換為左邊指針的類型。
例如:
float *p1;
int *p2;
p1 = p2;
其中p1 = p2語句會編譯出錯,提示“'=' : cannot convert from 'int *' to 'float *'”,必須改為:
p1 = (float *)p2;
而void *則不同,任何類型的指針都可以直接賦值給它,無需進行強制類型轉換:
void *p1;
int *p2;
p1 = p2;
但這并不意味著,void *也可以無需強制類型轉換地賦給其它類型的指針。因為“無類型”可以包容“有類型”,而“有類型”則不能包
容“無類型”。道理很簡單,我們可以說“男人和女人都是人”,但不能說“人是男人”或者“人是女人”。下面的語句編譯出錯:
void *p1;
int *p2;
p2 = p1;
提示“'=' : cannot convert from 'void *' to 'int *'”。
擴展資料:
void關鍵字的使用規(guī)則:
規(guī)則一 如果函數(shù)沒有返回值,那么應聲明為void類型
在C語言中,凡不加返回值類型限定的函數(shù),就會被編譯器作為返回整型值處理。但是許多程序員卻誤以為其為void類型。例如:
add ( int a, int b )
{
return a + b;
}
int main(int argc, char* argv[])
{
printf ( "2 + 3 = %d", add ( 2, 3) );
}
程序運行的結果為輸出:
2 + 3 = 5
這說明不加返回值說明的函數(shù)的確為int函數(shù)。
林銳博士《高質量C/C++編程》中提到:“C++語言有很嚴格的類型安全檢查,不允許上述情況(指函數(shù)不加類型聲明)發(fā)生”??墒蔷幾g
器并不一定這么認定,譬如在Visual C++6.0中上述add函數(shù)的編譯無錯也無警告且運行正確,所以不能寄希望于編譯器會做嚴格的類型檢查。
因此,為了避免混亂,我們在編寫C/C++程序時,對于任何函數(shù)都必須一個不漏地指定其類型。如果函數(shù)沒有返回值,一定要聲明為void類
型。這既是程序良好可讀性的需要,也是編程規(guī)范性的要求。另外,加上void類型聲明后,也可以發(fā)揮代碼的“自注釋”作用。代碼的“自注
釋”即代碼能自己注釋自己。
規(guī)則二如果函數(shù)無參數(shù),那么應聲明其參數(shù)為void
在C++語言中聲明一個這樣的函數(shù):
int function(void)
{
return 1;
}
則進行下面的調用是不合法的:
function(2);
因為在C++中,函數(shù)參數(shù)為void的意思是這個函數(shù)不接受任何參數(shù)。
我們在Turbo C 2.0中編譯:
#include "stdio.h"
fun()
{
return 1;
}
main()
{
printf("%d",fun(2));
getchar();
}
編譯正確且輸出1,這說明,在C語言中,可以給無參數(shù)的函數(shù)傳送任意類型的參數(shù),但是在C++編譯器中編譯同樣的代碼則會出錯。在C++
中,不能向無參數(shù)的函數(shù)傳送任何參數(shù),出錯提示“'fun' : function does not take 1 parameters”。
所以,無論在C還是C++中,若函數(shù)不接受任何參數(shù),一定要指明參數(shù)為void。
規(guī)則三 小心使用void指針類型
按照ANSI(American National Standards Institute)標準,不能對void指針進行算法操作,即下列操作都是不合法的:
void * pvoid;
pvoid++; //ANSI:錯誤
pvoid += 1; //ANSI:錯誤
//ANSI標準之所以這樣認定,是因為它堅持:進行算法操作的指針必須是確定知道其指向數(shù)據(jù)類型大小的。
//例如:
int *pint;
pint++; //ANSI:正確
pint++的結果是使其增大sizeof(int)。( 在VC6.0上測試是sizeof(int)的倍數(shù))
但是大名鼎鼎的GNU(GNU's Not Unix的縮寫)則不這么認定,它指定void *的算法操作與char *一致。
因此下列語句在GNU編譯器中皆正確:
pvoid++; //GNU:正確
pvoid += 1; //GNU:正確
pvoid++的執(zhí)行結果是其增大了1。( 在VC6.0上測試是sizeof(int)的倍數(shù))
在實際的程序設計中,為迎合ANSI標準,并提高程序的可移植性,我們可以這樣編寫實現(xiàn)同樣功能的代碼:
void * pvoid;
(char *)pvoid++; //ANSI:正確;GNU:正確
(char *)pvoid += 1; //ANSI:錯誤;GNU:正確
GNU和ANSI還有一些區(qū)別,總體而言,GNU較ANSI更“開放”,提供了對更多語法的支持。但是我們在真實設計時,還是應該盡可能地迎合ANSI標準。
main 函數(shù)的返回值用于說明程序的退出狀態(tài)。如果返回 0,則代表程序正常退出,否則代表程序異常退出。
在 C89中,main() 是可以接受void返回值的。在最新的 C99 標準中,只有以下兩種定義方式是正確的:
int main( void )
int main( int argc, char *argv[] )
如果你不需要從命令行中獲取參數(shù),請用 int main( void ) ;否則請用 int main( int argc, char *argv[] ) 。main 函數(shù)的返回值類型必須是 int ,這樣返回值才能傳遞給操作系統(tǒng)。
如果 main 函數(shù)的最后沒有寫return 語句的話,C99 規(guī)定編譯器要自動在生成的目標文件中(如 exe 文件)加入 return 0 ,表示程序正常退出。注意,vc6 不會在生成的目標文件中加入return 0 .不過,gcc3.2(Linux 下的 C 編譯器)會在生成的目標文件中加入return 0 。
void 被翻譯為"無類型",相應的void *?為"無類型指針"。常用在程序編寫中對定義函數(shù)的參數(shù)類型、返回值、函數(shù)中指針類型進行聲明。
void的作用
1、對函數(shù)返回的限定,這種情況我們比較常見。
2、對函數(shù)參數(shù)的限定,這種情況也是比較常見的。
C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用于底層開發(fā)。C語言能以簡易的方式編譯、處理低級存儲器。
C語言是僅產生少量的機器語言以及不需要任何運行環(huán)境支持便能運行的高效率程序設計語言。盡管C語言提供了許多低級處理的功能,但仍然保持著跨平臺的特性,以一個標準規(guī)格寫出的C語言程序可在包括類似嵌入式處理器以及超級計算機等作業(yè)平臺的許多計算機平臺上進行編譯。
【void的含義】
void的字面意思是“無類型”,void
*則為“無類型指針”,void
*可以指向任何類型的數(shù)據(jù)。
void幾乎只有“注釋”和限制程序的作用,因為從來沒有人會定義一個void變量,
void真正發(fā)揮的【作用】在于:
(1)
對函數(shù)返回的限定;
(2)
對函數(shù)參數(shù)的限定。
我們知道,在定義函數(shù)時,加在函數(shù)名前的“void”表示該函數(shù)沒有返回值。但在調用時,在函數(shù)名前加“(void)”的作用又是什么呢?
最明顯的一點就是表示程序并不關心調用該函數(shù)后的返回值是什么,比如函數(shù)strcpy,我們直接用“strcpy(des_str,
src_str);”這樣的形式來調用。“(void)strcpy(des_str,
src_str);”這樣的形式還真不多見!
原因是這種寫法不針對人,也不針對編譯器,而是針對靜態(tài)代碼檢測工具,它會把函數(shù)返回值作為一項檢測標準。在某些大公司,比較重視代碼規(guī)范,若在代碼靜態(tài)檢測時需要檢測該項。此時就需要用在被調用的函數(shù)(名)前加上“(void)”這種形式來告訴靜態(tài)代碼檢測工具程序并非沒有處理該函數(shù)的返回值,而是該處確實不需要處理它(該函數(shù)的返回值),不需要再對該處代碼作此項檢測。其實這和我們在代碼中使用“#pragma
warning
(disable:
XXXX)”的道理是一樣的。
l例如:
統(tǒng)計整數(shù)里面各位
1
2
3
的個數(shù)
//***************************************************
#
include
stdio.h
int
c1,
c2,
c3;
void
fun(long
n)
{
c1
=
c2
=
c3
=
0;
while
(n
!=
0)
{
switch
(n
%
10)
{
case
1:
c1++;
break;
case
2:
c2++;
break;
case
3:
c3++;
}
n
/=
10;
}
}
int
main()
{
long
n;
scanf("%ld",
n);
//輸入整數(shù)n
fun(n);
//調用自定義函數(shù)fun
printf("C1=%d
C2=%d
C3=%d\n",
c1,
c2,
c3);
//輸出
}
空類型確實是無返回值。
不過由于不同編譯器規(guī)則不一樣,void空返回不一定是通用于各種編譯器的,所以這樣寫出來的程序的移植性能很差,而且,標準C文件里并沒有把void寫進去。
所以,寫程序的時候即便沒什么用,也最好以指定返回類型為int,在代碼末尾加上一句return 0;即可。
每個函數(shù)都做一件事,事情做完的話最好告訴別人,函數(shù)也是,fun就是一個人,后面括號里面的就是傳入?yún)?shù),也就是別人叫你做的事,fun前面的是返回值,就是你告訴別人這件事做的怎么樣了,void類型就是空類型,做完了不告訴別人,在函數(shù)里面return
;就行了。寫個簡單的例子
int
add(int
a,int
b)
{
return
a+b;
}
這個就是把a+b的結果傳出去,因為是int行,所以返回值也是int型,就用int了