void 型別比較特殊,它可以表示所有的型別,但是又不能像其他型別那樣宣告成實體。在很多專案中的函式的引數使用void* 型陣列,在void*陣列中,即可以有int型,可以有char型,也可以有結構體,將這些引數放在乙個void* 型陣列中。
值得注意的是,不能直接使用void型變數,而是使用void*,即void 型的指標。
比如:
int a;
void b;
void* c;
這裡第一行宣告是正確的,第二行宣告是錯誤的,第三行是正確的。
void指標變數的正確用法為:
1.將int型轉換成void*型:
void *c = null;
int a = 10;
c = (int*)&a;
std::cout<<(*(int*)c);
這裡有很多人會犯這樣的錯誤 : 『void*』不是乙個指向物件的型別,**如下
void *c = null;
int a = 10;
c = (int*)&a;
std::cout
<<(*c)《這裡可以有人認為c = (int*)&a;這裡已經將c的型別強制轉換成了int*型,事實上是沒有的,還需要在使用的時候進行強制轉換。
2.將char* 轉換成void*型:
1.char* 開闢陣列
void *c = null;
char *a = null;
a = (char*)malloc(sizeof(char)*10);
char *b = a;
for(int i =0;i < 5;i++)
*b = '\0';
c = (char*)a;
cout<<(char*)c;
/***輸出結果: abcde***/
2.void* 開闢陣列
void *c = null;
char *a = null;
c = (char*)malloc(sizeof(char)*10);
a = (char*) c;
for(int i =0;i < 5;i++)
*a = '\0';
cout<<(char*)c;
/***輸出結果: abcde***/
這兩種方法本質是一樣的,個人喜好而已。
void* 型別的陣列使用
比如說我在乙個函式中需要使用int型引數乙個,char型引數乙個,char*型引數乙個,而我又不想使引數列表太長,所以我決定使用void*陣列替代以上三個引數。
void* arg[3]; //宣告乙個void*型陣列
int a = 10;
char b = 'b';
char *c = null; //原來的引數是 a ,b ,c
arg[0] = (int*)&a;
arg[1] = (char*)&b;
arg[2] = malloc(sizeof(char)*10);
c = (char*)arg[2];
for(int i = 0; i < 5;i++)
*c = '\0';
//轉換後的引數為arg 是乙個void*型的陣列,在使用時也需要按照對應的型別進行強制轉換
cout<<*(int*)arg[0]<<'\n';
cout<<*(char*)arg[1]<<'\n';
cout<<(char*)arg[2]<<'\n';
/***輸出: 10b
abcde
***/
void* 陣列雖然可以使函式的引數個數變少,但是缺點也是顯而易見的,當你在函式的引數列表中看到乙個void*陣列時,你是不知道它究竟代表什麼意思,所以在使用void*型陣列傳參時一定要寫好注釋,利人利己。以上是我的個人經驗,其他的利弊還沒有深入**。
//以下內容參考:
這裡附上的總結:
1.void型別表示無型別,也可以看成是任意型別。
比如: void* c = (int )a; void c = (char *)a;等等
2.可以使用任意型別的指標為void型指標賦值,但是不能用void型指標為已知型別的指標賦值。
void* c = (int *)a; 正確
int b = (void)d; 錯誤
3.函式的引數使用void型指標,表示可以傳入任意型別的引數。
int add(void* a, void* b);
所以當你看到這樣乙個引數列表時,根本不知的a,b 的具體型別(int or unsigned int 等等)。
4.void可以看成是一種抽象型別,想想virtual,虛函式、虛基類,他們都是抽象的,是虛的。所以不能例項化乙個虛的東西,也就是說不能宣告乙個void型的變數(注意這裡我說的是變數,不是指標)。可以想象成void型別是所有已知型別之上的乙個抽象型別。
所以在使用malloc時一般都會在前面加上乙個指標型別進行強制轉換。
5.既然void型別是抽象的,那麼就不能對它進行具體的算數運算,例如void * pvoid; pvoid++; pvoid +=2;都是invalid,指標的++操作是給當前分配的記憶體空間增大乙個單元的空間,可是void型別你都不知道它要存啥,你當然不知道他乙個單元要多大,所以就不能做算術運算。
void指標型別
void指標 void指標有兩個屬性 指向變數 物件的位址和長度,但是指標只儲存位址,長度則取決於指標的型別,編譯器根據指標的型別從指標指向的位址向後定址,指標型別不同則定址範圍也不同,比如 int 從指定位址向後尋找4位元組作為變數的儲存單元,double 從指定位址向後尋找8位元組作為變數的儲存...
void型別指標
void型別指標在c語言中被稱為通用指標或者泛指針,主要目的是針對純粹的位址操作。void型指標指向某個物件,但是該物件不屬於任何型別。因此在ansic中無法對其進行 操作,但是在gnu中是可以的,原因是gnu將其與char型別的操作視為相同 linux下將void 看成是char 1 有型別的指標...
void型別指標
指標有兩個屬性 指向變數 物件的位址和長度 但是指標只儲存位址,長度則取決於指標的型別 編譯器根據指標的型別從指標指向的位址向後定址 指標型別不同則定址範圍也不同,比如 int 從指定位址向後尋找4位元組作為變數的儲存單元 double 從指定位址向後尋找8位元組作為變數的儲存單元 1.void指標...