void 型別指標以及指標陣列

2021-07-11 13:56:55 字數 2742 閱讀 7678

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指標...