• void指针


    void指针
    指针有两个属性:指向变量/对象的地址
    和长度
    但是指针只存储地址,长度则取决于指针的类型
    编译器根据指针的类型从指针指向的地址向后寻址
    指针类型不同则寻址范围也不同,比如:
    int*从指定地址向后寻找4字节作为变量的存储单元
    double*从指定地址向后寻找8字节作为变量的存储单元

    1.void指针是一种特别的指针
       void *vp
      //说它特别是因为它没有类型
      //或者说这个类型不能判断出指向对象的长度

    2.任何指针都可以赋值给void指针
      type *p;
      vp=p;
      //不需转换
      //只获得变量/对象地址而不获得大小

    3.void指针赋值给其他类型的指针时都要进行转换
       type *p=(type*)vp;
       //转换类型也就是获得指向变量/对象大小
    转:http://icoding.spaces.live.com/blog/cns!209684E38D520BA6!130.entry

    4.void指针不能复引用
      *vp//错误
      因为void指针只知道,指向变量/对象的起始地址
      而不知道指向变量/对象的大小(占几个字节)所以无法正确引用

    5.void指针不能参与指针运算,除非进行转换
       (type*)vp++;
      //vp==vp+sizeof(type)



    #include<iostream>
    #include<stdlib.h>
    #include<string>
    using namespace std;
    typedef struct tag_st
    {
    char id[10];
    float fa[2];
    }ST;
    //我在程序里面这样使用的
    int main()
    {
    ST * P=(ST *)malloc(sizeof(ST));
    strcpy(P->id,"hello!");
    P->fa[0]=1.1;
    P->fa[1]=2.1;

    ST * Q=(ST *)malloc(sizeof(ST));
    strcpy(Q->id,"world!");
    Q->fa[0]=3.1;
    Q->fa[1]=4.1;
    void ** plink=(void **)P;
    *((ST *)(plink)) = * Q; //plink要先强制转换一下,目的是为了让它先知道要覆盖的大小.
                             //P的内容竟然给Q的内容覆盖掉了.
    cout<<P->id<<" "<<P->fa[0]<<" "<<P->fa[1]<<endl;
    return 0;
    }
  • 相关阅读:
    windows 7 自定义sendTo
    EntLib5.0 DAAB(Data Access Application Block),数据访问程序块 简单示例
    C#命令行重定向
    “Java decompiler” http://java.decompiler.free.fr/
    HtmlToPdf HTML转PDF工具
    百慕大三角
    OpenAL Installer for Windows
    April 2006 DirectX SDK is now available
    GDC2006
    感慨啊,我国的电子竞技!
  • 原文地址:https://www.cnblogs.com/vicsmb/p/2334587.html
Copyright © 2020-2023  润新知