http://hi.baidu.com/%B3%CB%B7%E7%CC%A4%C0%CB2008/blog/item/ff1066faeb5a19929e5146ad.html
今天在看memcpy函数原型的时候遇到void指针,我有些地方不明白,就从网上搜集了一些资料,然后总结一下。
先来看下memcpy函数的原型:
void * memcpy ( void * destination, const void * source, size_t num )
我开始以为void指针可以进行应用和计算,出现如下愚蠢的错误:
void * dest,src;
*dest ++= *src++;
知错就改,补习一下指针的知识。
基本概念:“指针”是指地址, 是常量,“指针变量”是指取值为地址的变量。 定义指针的目的是为了通过指针去访问内存单元。
指针有两个属性:指向变量或者对象的地址和长度。但是指针只存储地址,长度则取决于指针的类型 ,编译器根据指针的类型从指针指向的地址向后寻址 指针类型不同则寻址范围也不同。比如: int*从指定地址向后寻找4字节作为变量的存储单元 double*从指定地址向后寻找8字节作为变量的存储单元。
(1)void指针是一种特别的指针。void指针没有特定的类型,因此只知道地址而不能由类型判断出指针所指变量或者对象的长度。
void * vp;
(2)任何类型的指针都可以赋给void指针。不需要类型转换,vp只是获取地址,并没有获得变量或者对象的长度。
type * p;
void* vp = p;
(3)void指针赋值给其他类型的指针时都要进行转换
void * vp =pointer; // vp指向一个变量
type *p = (type*) vp; //类型转换
(4)void指针不能引用
void * vp =pointer; // vp指向一个变量
*vp // 错误的
(5)void指针不能参与指针运算,除非进行转换
void * dest, *src;
*dest ++= *src++; //错误的
void * vp =pointer;
(type*)vp++ //进行类型转换后才可以进行指针运算