1. 程式人生 > >C語言中的void的理解

C語言中的void的理解

1 初學者對C/C++語言中的void及void指標型別不甚理解,因此在使用上出現了一些錯誤。本文將對void關鍵字的深刻含義進行解說,並
詳述void及void指標型別的使用方法與技巧。
2.void的含義
void的字面意思是“無型別”,void *則為“無型別指標”,void *可以指向任何型別的資料。
void幾乎只有“註釋”和限制程式的作用,因為從來沒有人會定義一個void變數,讓我們試著來定義:
void a;
這行語句編譯時會出錯,提示“illegal use of type 'void'”。不過,即使void a的編譯不會出錯,它也沒有任何實際意義。
void真正發揮的作用在於:
(1) 對函式返回的限定;
(2) 對函式引數的限定。
我們將在第三節對以上二點進行具體說明。
眾所周知,如果指標p1和p2的型別相同,那麼我們可以直接在p1和p2間互相賦值;如果p1和p2指向不同的資料型別,則必須使用強制型別
轉換運算子把賦值運算子右邊的指標型別轉換為左邊指標的型別。
例如:
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 *'”。
3.void的使用
下面給出void關鍵字的使用規則:
規則一 如果函式沒有返回值,那麼應宣告為void型別
在C語言中,凡不加返回值型別限定的函式,就會被編譯器作為返回整型值處理。但是許多程式設計師卻誤以為其為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
這說明不加返回值說明的函式的確為int函式。
補充:void 中文翻譯為"無型別"。常用在程式編寫中對定義函式的引數型別、返回值、函式中指標型別進行宣告。
void的字面意思是"無型別",void *則為"無型別指標",void *可以指向任何型別的資料。
在C語言中,凡不加返回值型別限定的函式,就會被編譯器作為返回整型值處理。但是許多程式設計師卻誤以為其為void型別。

相關推薦

C言中void理解

1 初學者對C/C++語言中的void及void指標型別不甚理解,因此在使用上出現了一些錯誤。本文將對void關鍵字的深刻含義進行解說,並 詳述void及void指標型別的使用方法與技巧。 2.void的含義 void的字面意思是“無型別”,void *則為“無型別指標”,

C言中malloc函數的理解

萬能 一個 函數 語言 就是 有一個 類型轉換 har 扯淡 在C語言中malloc函數主要是用在堆內存的申請上,使用malloc函數時,函數會返回一個void *類型的值,這個值就是你申請的堆內存的首地址;為什麽返回的地址是一個void *類型的地址呢?首先我們要先弄明白

對嵌入式C言中volatile的理解

一.前言 1.編譯器優化介紹: 由於記憶體訪問速度遠不及CPU處理速度,為提高機器整體效能,在硬體上引入硬體快取記憶體Cache,加速對記憶體的訪問。另外在現代CPU中指令的執行並不一定嚴格按照順序執行,沒有相關性的指令可以亂序執行,以充分利用CPU的指令流水線,提高執行速

C言中voidvoid*的定義及用法

void void最常見的用法,就是在函式中限定函式的引數和返回值的 void draw(void); 表明函式draw沒有引數也沒有返回值,void在別的的地方的應用我也沒見過; 實際上,如果把void 和int,char,double等型別放到一起理解的話,首先還是那

C語言語法_C言中(void)(&_a == &_b)或者更為抽象的(void)object的作用

非技術性文章,只是為了分享解決問題的方法 小白在複習C語言資料結構檢視Linux原始碼的時候,看到了Linux原始碼中MAX(a,b)的實現,它能夠比較2個任意型別的資料(可行的情況下)並獲得最大值,實現得非常通用。Linux是利用巨集,並且使用了GNU的

C言中voidvoid指標-void*

void 關鍵字 當函式返回值為空時,可以使用void。 void empty(int a); 當函式引數列表為空時,可以使用void。 void empty(void

C言中malloc、calloc、realloc動態記憶體分配的理解

void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(size_t numElements, size_t sizeOfElement); 都在stdlib.h函式庫內 它們的返回值都是請求系

C言中switch...case語句中break的重要性

不能 實現 比例 重要性 case語句 毫無 ... 應該 switch 在C語言中switch...case語句是經常用到的,下面我介紹一下在使用該語句時候需要註意的一個細節問題。話不多說,直接舉例子: 例子1: switch(fruit) { case 1:printf

c言中char* 代表什麽

c 字符數組 1 c語言中,char* 代表 字符指針類型,當其指向一個字符串的第一個元素時,它就可以代表這個字符串了2 示例#include<stdio.h>int main(){ char* str = "learn c"; printf("%s\n", str);

C言中“段錯誤”出現的場景

oca auth pan clas log ted start 符號 cnblogs 1 /************************************************************************* 2 > Fil

c言中continue的運用,同時學習接收字符,打印字符,遍歷字符

putc pre 讀取 ext cnblogs enter pri void blog 1 /************************************************************************* 2 > Fi

c言中fflush的運用為什麽沒有效果呢,測試平臺linux

*** file 語言 stdlib.h clu author 年齡 blog name 1 /************************************************************************* 2 > F

C言中,隱藏結構體的細節

all printf span 包括 strcpy () 創建 提高 結構體指針 我們都知道,在C語言中,結構體中的字段都是可以訪問的。或者說,在C++ 中,類和結構體的主要區別就是類中成員變量默認為private,而結構體中默認為public。結構體的這一個特性,導致結構

C言中的union使用方法

位置 http term 位域 dem 結構體 數據結構 pri 使用 union共用聲明和共用一變量定義: “聯合”是一種特殊的類。也是一種構造類型的數據結構。在一個“聯合”內能夠定義多種不同的數據類型。 一個被說明為該“聯合”類型的變量中,同意裝入該“

C言中的typedef

中文 講解 tro table 現在 int 一個 cor 位置 typedef 的講解與應用實例   前言:我們學過C語言的人都應該聽過,或者說學過,甚至說用過typedef,多多少少都對其有所了解。不過就算沒聽過也沒關系,我們一起來探討一下。   闡述:typedef

C言中的main函數以及main函數是如何被調用的

連接 命令 c程序 指定 www blog nbsp 程序 編譯器 main函數是C語言中比較特殊的函數,C程序總是從main函數開始執行,main函數的原型是: 1 int main(int argc, char *argv[]); 其中argc是命令行參數的個數,a

C言中do...while(0)的妙用-避免goto

java ng- pop execute size 釋放資源 and var text 使用goto的優雅並避免結構的混亂 將要跳轉到的語句用do{…}while(0) 包起來就可以。 reference #defien N 10 bool

【轉載】在C言中,double、long、unsigned、int、char類型數據所占字節數

src 有關 指針變量 none nbsp ide iso isp cli 和機器字長及編譯器有關系: 所以,int,long int,short int的寬度都可能隨編譯器而異。但有幾條鐵定的原則(ANSI/ISO制訂的): 1 sizeof(short int)&

關於C言中的Complex(復數類型)和imaginary(虛數類型)

http 個人 time 編譯 pop oat float environ real 關於C語言中的Complex(復數類型)和imaginary(虛數類型) 其實這裏的復數complex就是數學裏的復數,包含實部和虛部兩個部分,比如:x=2.1+6i,下面進行詳細介紹

c言中fscanf和fprintf

寫的權限 set per efi errno fclose pri form price 很多時候我們需要寫入數據到文件中時都覺得很困擾,因為格式亂七八槽的,可讀性太差了,於是我們就想有沒有什麽函數可以格式化的從文件中輸入和輸出呢,還真有。下面我將講解一下fscanf和fp