冠冕堂皇

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

演示代码下载

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;
   }

  

  

posted on 2013-05-07 17:57  冠冕堂皇  阅读(477)  评论(0编辑  收藏  举报