void類型指針在使用中與其他類型指針不同,在使用中應注意:
1.無類型指針不能對記憶體進行解釋,隻能獲得對象位址
int main()
{
void *p;
int n=sizeof(*p);
printf("%d\n", n);
return 0;
}
當程式編譯到sizeof(*p)時報錯,p不是指向完整類型的指針,也就是說編譯器此時不知道該将p指針解釋為多少個位元組。
2. 無類型指針不能不能自加或自減
- void類型的指針為常量,自加或自減勢必要改變自身的值,而指針指向的位址為常量,不可改變。
- 編譯器無法解釋無類型指針元素所占位元組長度,是以自加或自減無法确定指針移動多少個位元組。
- 要實作void指針的運算,必須強制轉換為某一完整類型。
3. 無類型指針不能解引用
因為void指針隻知道,指向變量/對象的起始位址,但是不知道指向變量/對象的大小(占幾個位元組)是以無法正确引用
4. 無類型指針可以接受任何指針的指派
void指針可以指向任何類型的資料位址,是以也稱為通用指針或者泛指針,或者叫做萬能指針,但是得到的隻是指派過來的首位址,void類型仍然限制了對資料的操作。(僅在c語言中有該特性,c++中不具有)
ok,畫重點!無類型函數在記憶體操作的3個應用函數:
1.記憶體移動函數 (也可實作記憶體拷貝)
void * memmove(void * _Dst, const void * _Src, size_t _Size);
2.記憶體拷貝函數
void *memcpy(void * _Dst, const void * _Src,size_t _Size);
3.記憶體設定函數
void * memset(void * _Dst, _ int _Val, _ size_t _Size);
檢視函數詳解: