天天看點

c語言中無類型void*指針的幾大特性void類型指針在使用中與其他類型指針不同,在使用中應注意:ok,畫重點!無類型函數在記憶體操作的3個應用函數:

void類型指針在使用中與其他類型指針不同,在使用中應注意:

1.無類型指針不能對記憶體進行解釋,隻能獲得對象位址

int main()
{
	void *p;
	int n=sizeof(*p);
	printf("%d\n", n);
	return 0;
}
           

當程式編譯到sizeof(*p)時報錯,p不是指向完整類型的指針,也就是說編譯器此時不知道該将p指針解釋為多少個位元組。

2. 無類型指針不能不能自加或自減

  1. void類型的指針為常量,自加或自減勢必要改變自身的值,而指針指向的位址為常量,不可改變。
  2. 編譯器無法解釋無類型指針元素所占位元組長度,是以自加或自減無法确定指針移動多少個位元組。
  3. 要實作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);

檢視函數詳解:

繼續閱讀