指針有兩個屬性:指向變量/對象的地址和長度
但是指針只存儲地址,長度則取決於指針的類型
編譯器根據指針的類型從指針指向的地址向後尋址
指針類型不同則尋址範圍也不同,比如:
int*從指定地址向後尋找4字節作爲變量的存儲單元
double*從指定地址向後尋找8字節作爲變量的存儲單元
1.void指針是一種特別的指針
void *vp
//說它特別是因爲它沒有類型
//或者說這個類型不能判斷出指向對象的長度
2.任何指針都可以賦值給void指針
type *p;
vp=p;
//不需轉換
//只獲得變量/對象地址而不獲得大小
3.void指針賦值給其他類型的指針時都要進行轉換
type *p=(type*)vp;
//轉換類型也就是獲得指向變量/對象大小
轉:http://icoding.spaces.live.com/blog/cns!209684E38D520BA6!130.entry
4.void指針不能復引用
*vp//錯誤
因爲void指針只知道,指向變量/對象的起始地址
而不知道指向變量/對象的大小(佔幾個字節)所以無法正確引用
5.void指針不能參與指針運算,除非進行轉換
(type*)vp++;
//vp==vp+sizeof(type)
什麼時候使用void指針?
當進行純粹的內存操作時,或者傳遞一個指向未定類型的指針時,可以使用void指針。void指針也常常用作函數指針。
有些C代碼只進行純粹的內存操作。在較早版本的C中,這一點是通過字符指針(char *)實現的,但是這容易產生混淆,因爲人們不容易判斷一個字符指針究竟是指向一個字符串,還是指向一個字符數組,或者僅僅是指向內存中的某個地址。
例如,strcpy()函數將一個字符串拷貝到另一個字符串中,strncpy()函數將一個字符串中的部分內容拷貝到另一個字符串中:
char *strepy(char'strl,const char *str2);
char *strncpy(char *strl,const char *str2,size_t n);
memcpy()函數將內存中的數據從一個位置拷貝到另一個位置:
void *memcpy(void *addrl,void *addr2,size_t n);
memcpy()函數使用了void指針,以說明該函數只進行純粹的內存拷貝,包括NULL字符(零字節)在內的任何內容都將被拷貝。請看下例:
#include "thingie.h" /* defines struct thingie */
struct thingie *p_src,*p_dest;
/* ... */
memcpy(p_dest,p_src,sizeof(struct thingie) * numThingies);
在上例中,memcpy()函數要拷貝的是存放在structthingie結構體中的某種對象op_dest和p_src都是指向structthingie結構體的指針,memcpy()函數將把從p_src指向的位置開始的sizeof(stuctthingie) *numThingies個字節的內容拷貝到從p_dest指向的位置開始的一塊內存區域中。對memcpy()函數來說,p_dest和p_src都僅僅是指向內存中的某個地址的指針。