• 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;
    } 
  • 相关阅读:
    第二章整理
    汇编实验二
    汇编实验一
    第一章整理
    第一部分 | 第1章 —— Hello Cocos2d-x
    返回 *this 的成员函数以及 const重载
    C++中的const
    680. Valid Palindrome II
    字典树
    单调队列
  • 原文地址:https://www.cnblogs.com/freyr/p/3474424.html
Copyright © 2020-2023  润新知