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);
查看函数详解: