zoukankan      html  css  js  c++  java
  • (转)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;
    }

  • 相关阅读:
    中国国家授时中心的时间服务器IP地址及时间同步方法
    找不到aspnet用户权限的解决方法
    unbunt下刻录光盘
    关于ubuntu 是否需要使用std::到问题。
    acm题
    IIS发生意外错误0x8ffe2740
    SQL Server Express的使用
    解决用户"sa"登录失败。该用户与可信 sql server 连接无关联。
    在CSDN上的第一篇博客
    在线求助 man page(转)
  • 原文地址:https://www.cnblogs.com/yuan19/p/3396760.html
Copyright © 2011-2022 走看看