1.void * 指针是 一种特殊的指针
void *p
//说它特殊是因为它没有类型
//或者说这个类型不能判断出指向对象的长度
2.任何指针都可以赋值给void指针
type *ptr;
p=ptr;
//不需转换
// 只获得变量/对象地址而不获得大小
3.void* 指针赋值给其他类型的指针时都要进行转换
type *ptr=(type*)p;
//转换类型也就是获得指向变量/对象大小
4.void指针不能复引用
*p//错误
因为void指针只知道,指向变量/对象的起始地址
而 不知道指向变量/对象的大小(占几个字节)所以无法正确引用
5.void指针不能参与指针运算,除非进行转换
(type*)p++;
//p==p+sizeof(type)
举例:
编程实现memcpy函数
// TestVoidPointer.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <stdio.h> #include <assert.h> void *memcpy(void *Dest, const void *Src, size_t size) { assert((Dest!= NULL) && (Src!= NULL)); //Dest和Src必须有效 char *src= (char *)Src; //保存Src首地址,无类型指针赋值给char 指针要进行转换 char *des= (char *)Dest; //保存Dest首地址,无类型指针赋值给char 指针要进行转换 while(size -- > 0) //循环size次,复制src的值到des中 { *des++ = *src++ ; } return des; } int _tmain() { char strSrc[] = "Hello World!"; //将被复制的字符数组 char strDest[20]; //目的字符数组 memcpy(strDest, strSrc, 4); //复制strSrc的前4个字符到strDest中 strDest[4] = '\0'; //把strDest的第5个元素赋为结束符'\0' printf("strDest: %s\n", strDest); return 0; }