C语言再学习 -- 关键字void
生活随笔
收集整理的這篇文章主要介紹了
C语言再学习 -- 关键字void
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
參看:C語言關鍵字
void 用途:
1、對函數返回的限定,用于強調函數沒有返回值。如,void func(int x);2、對函數參數的限定,用于強調函數沒有任何參數。如,int func(void);
3、指向void的指針。如 void *vp = NULL;
4、丟掉函數調用的返回值。如, int func(int x); ?(void)func(5);
5、(void)0,(void)1,(void *)0,(void*)0x100000
1、void
void對象的(不存在的)值不能夠以任何方式使用,也不能被顯式或隱式地轉換為任一非空類型。因為void表達式表示一個不存在的值,這樣的表達式只可以用在不需要值的地方,例如:作為一個表達式語句或作為逗號運算符的左操作數。(《C程序設計語言》 附錄A.6.7)
1)不能被顯式或隱式地轉為任一非空類型
int x = 12, y = 0; y= (int)((void)x); // 錯誤:'type cast' : cannot convert from 'void' to 'int' y= (int)((void)123);//錯誤: 'type cast' : cannot convert from 'void' to 'int'
2)void 表達式只能用在不需要的地方
int x = 12, y = 0; (void)x;//正確:表達式語句 y = ((void)x, 123);//正確:逗號運算符的左操作數
3)定義void變量
void a;//是錯誤的,因為定義變量時必須分配內存空間,定義void類型變量,編譯器不知該分配多大的內存空間。
4)將表達式強制轉換為void類型
define min(x,y) ({ \ typeof(x) _x = (x); \ typeof(y) _y = (y); \ (void) (&_x == &_y); \ _x < _y ? _x : _y; })
(void)(&_x == &_y);其中&_x == &_y是關系表達式,如果關系為真,則表達式的結果值為數值1;如果為假,則結果值為數值0。故而,(void)(&_x == &_y);等價于(void)0;或(void)1;
int func(int x); void func(5);
(void)func(5);在表達式語句中一個空的強制類型轉換將丟掉函數調用的返回值。
5)(void)0
標準庫頭文件:assert.h #define assert(test) ((test) ? (void)0 : _Assert(__FILE__“:”__STR(__LINE__)”” #test))
(void)0的作用相當于函數返回類型為void限定,它僅是一個占位符表達式,什么都不做。
2、指向void的指針
指向任何類型的指針都可以轉為void *類型,且不會丟失信息。如果將結果再轉換為初始指針類型,則可以恢復初始指針。
void *vp; char *cp; vp = cp; /*指向任何類型的指針都可以轉為void *類型,且無需強制轉換*/ cp = (char *)vp;
但是需要注意:“空類型”可以包容“有類型”,而“有類型”則不能包容“空類型”。
void *p1; int *p2; p2 = p1; C編譯 是OK的 C++編譯出現 錯誤: 從類型‘void*’到類型‘int*’的轉換無效 [-fpermissive]
1)#define NULL (void*)0
定義NULL為指向內存位置為0的空指針。
NULL表示內存位置0,NULL指針并不指向任何對象。因此除非是用于賦值或比較運算,出于其他任何目的使用NULL指針都是非法的
2)將整型數值轉為指針
#define BUFFER_END 0x200000 void * b = (void *) BUFFER_END; if (b == (void *) 0x100000) b = (void *) 0xA0000;
指向特定類型的指針可以進行算術運算(+、-)和關系運算(==、!=、<、>、>=、<=),空類型指針不可以。
3、void修飾函數返回值和參數
如果函數沒有返回值,那么應聲明為 void 類型。在 C 語言中,凡不加返回值類型限定的函數,就會被編譯器作為返回 整型值 處理,但是許多程序員卻誤認為其為 void 類型。
#include <stdio.h>void main (void) {printf ("hello world!\n");return 0; } 編譯出現: 警告: 在無返回值的函數中,‘return’帶返回值 [默認啟用] #include <stdio.h>main () {printf ("hello world!\n");return 0; } 編譯OK
因此,為了避免混亂,我們在編寫 C 程序時,對于任何函數都必須一個不漏地指定其類型,如果函數沒有返回值,一定要聲明為 void 類型。
再有,無論在 C 還是 C++中,若函數不接受任何參數,一定要指明參數為 void。
總結
以上是生活随笔為你收集整理的C语言再学习 -- 关键字void的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电路基础知识 -- 数模信号
- 下一篇: springcloud config配置