無型別void*指標的幾大特性
阿新 • • 發佈:2018-12-27
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型別仍然限制了對資料的操作。
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);