zoukankan      html  css  js  c++  java
  • void*指针的由来

    【转载】http://blog.csdn.net/mhjcumt/article/details/7355127

    int a=1;

    int *p = &a;

    float *p1 = (float*)p;

    pp1的值都是&a,但是*p是将&a地址中的值按照int型变量进行解释,而*p1则是将&a地址中的值按照float型变量进行解释。


    鉴于指针之间这种灵活的强制类型转换的需求和出于简化代码的考虑,ANSI C引入了空指针即void*void指针又名万能指针,在现在的很多程序中,当参数不确定时就用万能指针代替,这一类的指针在线程\进程函数里特别常见。

    ANSI C规定,void指针可以复制给其他任意类型的指针,其他任意类型的指针也可以复制给void指针,他们之间复制不需要强制类型转换。当然任何地址也可以复制给void型指针。我们在《网络编程》中经常会看到accept(socket, (struct sockaddr *)&saddr_c, &lenth)之类的语句在&saddr_c之前需要增加代码(struct sockaddr *)是因为当此函数被设计的时候ANSI C还没有提出void*的概念。所有的地址统一用struct sockaddr类型标识,该函数的第二个参数也是指向struct sockaddr类型的指针,此处是强制类型转换。

    当然,在某些编译器中不同类型的指针也可以进行直接赋值,但一般情况下会给出类型不匹配的警告。要求程序员显示的给出指针强制类型转换可以提醒程序员小心使用指针,对于明确程序目的具有一定的好处。

  • 相关阅读:
    13. Docker容器内不能联网的6种解决方案
    12. Docker修改默认存储位置
    11. Docker为容器分配指定物理IP地址
    10.修改sysctl.conf提示没权限
    9. 使用ssh登陆Docker
    8. Docker
    7. Docker
    6. Docker
    Python生成器&迭代器
    Python装饰器
  • 原文地址:https://www.cnblogs.com/weiweishuo/p/3082617.html
Copyright © 2011-2022 走看看