1. 程式人生 > >C++ Primer 學習筆記與思考_7 void和void*指針的使用方法

C++ Primer 學習筆記與思考_7 void和void*指針的使用方法

能夠 amp space turn begin member use mem urn

(一)void的含義
void的字面意思是“無類型”,void差點兒僅僅有“凝視”和限制程序的作用,由於從來沒有人會定義一個void變量,讓我們試著來定義:
void a;
這行語句編譯時會出錯。提示“illegal use of type ‘void‘”。只是。即使void a的編譯不會出錯。它也沒有不論什麽實際意義。
void真正發揮的作用在於:
(1) 對函數返回的限定;

(2) 對函數參數的限定。

int f(void); equal to   int f();
void f();

(二)void*指針
C++提供了一種特殊的指針類型void*,它能夠保存不論什麽類型對象的地址。void*表明該指針與一地址值相關,可是不清楚在此地址上的對象的類型。

Void*指針僅僅支持幾種有限的操作:
1.與還有一個指針進行比較
2.向函數傳遞void*指針或從函數中返回void*指針
3.給還有一個void*指針賦值
4.不同意使用void*指針操縱它指向的對象
因為其它指針都包括有地址信息。所以將其它指針的值賦給空類型指針是合法的。反之,將空類型指針賦給其它指針則不被同意,除非進行顯式轉換。


因此。void*的作用大致例如以下:
1. 傳參:通用類型
能夠作為函數模板。鏈表等參數的通用參數。

在使用時,僅僅須要強制類型轉換就能夠。
在WinSocket編程中。_beginthread()函數的參數就是使用void*的一個實例。
2.強制類型轉換
有時候因為重載等的幹擾,導致須要轉換成void *,來進行取地址。


比如,(void *)obj.member。就能夠取到member的地址;直接&(obj.member)取到的實際上是obj的開始地址。
3.指向0的地址
(void *)0,指向全是0的地址。相當於NULL。
非void類型顯式轉換為void類型表達式,用於避免一些代碼靜態檢查工具的警告。

#include<iostream>
#include<string>
using namespace std;
int main()
{
	
	double obj=3.14;
	int a=7;
	double *pd=&obj;
	void *pv=&obj;  //ok 
	pv=&a;  //ok 
    (*pv)++; // error,不得操縱對象
	int *ptr=&a;
	void *p=ptr; //ok
	ptr=p;  //error,不能將空類型指針賦給其它指針 
	ptr=(int*)p; //ok,顯式轉換 
	return 0;
} 


C++ Primer 學習筆記與思考_7 void和void*指針的使用方法