• C++ Primer 学习笔记与思考_7 void和void*指针的使用方法


    (一)void的含义
    void的字面意思是“无类型”,void差点儿仅仅有“凝视”和限制程序的作用,由于从来没有人会定义一个void变量,让我们试着来定义:
    void a;
    这行语句编译时会出错。提示“illegal use of type 'void'”。只是。即使void a的编译不会出错。它也没有不论什么实际意义。
    void真正发挥的作用在于:
    (1) 对函数返回的限定;

    (2) 对函数參数的限定。

    int f(void); equal to   int f();
    void f();

    (二)void*指针
    C++提供了一种特殊的指针类型void*,它能够保存不论什么类型对象的地址。void*表明该指针与一地址值相关,可是不清楚在此地址上的对象的类型。

    Void*指针仅仅支持几种有限的操作:
    1.与还有一个指针进行比較
    2.向函数传递void*指针或从函数中返回void*指针
    3.给还有一个void*指针赋值
    4.不同意使用void*指针操纵它指向的对象
    因为其它指针都包括有地址信息。所以将其它指针的值赋给空类型指针是合法的。反之,将空类型指针赋给其它指针则不被同意,除非进行显式转换。


    因此。void*的作用大致例如以下:
    1. 传參:通用类型
    能够作为函数模板。链表等參数的通用參数。

    在使用时,仅仅须要强制类型转换就能够。
    在WinSocket编程中。_beginthread()函数的參数就是使用void*的一个实例。
    2.强制类型转换
    有时候因为重载等的干扰,导致须要转换成void *,来进行取地址。


    比如,(void *)obj.member。就能够取到member的地址;直接&(obj.member)取到的实际上是obj的開始地址。
    3.指向0的地址
    (void *)0,指向全是0的地址。相当于NULL。
    非void类型显式转换为void类型表达式,用于避免一些代码静态检查工具的警告。

    #include<iostream>
    #include<string>
    using namespace std;
    int main()
    {
    	
    	double obj=3.14;
    	int a=7;
    	double *pd=&obj;
    	void *pv=&obj;  //ok 
    	pv=&a;  //ok 
        (*pv)++; // error,不得操纵对象
    	int *ptr=&a;
    	void *p=ptr; //ok
    	ptr=p;  //error,不能将空类型指针赋给其它指针 
    	ptr=(int*)p; //ok,显式转换 
    	return 0;
    } 


  • 相关阅读:
    [改善Java代码]使用构造块精炼程序
    [改善Java代码]若有必要,使用变长数组
    [改善Java代码]警惕数组的浅拷贝
    [改善Java代码]在明确的场景下,为集合指定初始容量
    [改善Java代码] 枚举项数量限定为64个以内
    [改善Java代码]多种最值算法,适时选择
    [改善Java代码]推荐使用枚举定义常量
    [改善Java代码]性能考虑,数组是首选
    [改善Java代码]用偶判断,不用奇判断
    [改善Java代码]break万万不可忘
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7214644.html
Copyright © 2020-2023  润新知