浅谈void 和void*

你的名字 2022-08-05 12:26 301阅读 0赞

空类型 void 空类型指针void* 总结:

  1. 什么是void
    void 是空类型 ,不指向任何类型 ,用在两个地方:
    (1) 当函数不返回任何值时 函数的返回类型应该是void 而不是缺省状态,在缺省状态下函数的默认返回类型为 int
    (2) 当函数不接受任何类型的参数时,参数列表应该为void 而不是 缺省状态,缺省状态是表明函数可以接受任何类型 ,任何个数的参数
    如:
    void fun1(void);//函数fun1 不接受任何类型的参数,函数不返回任何值
    fun2();// 函数fun2可以接受任何类型任何个数的参数,函数返回值为 int 类型
  2. 什么是void*
    void* 是空指针类型,可以接受任何指针类型的赋值,但不可以赋值给任何实体指针类型,也不能进行任何指针类型的操作 如解地址,主要用在 对内存的管理中。
    如内存拷贝函数:
    void * memcpy(void *dest, const void *src, size_t len);

int a = 2;
int* p = & a;
void* p1;
p1 = p;//可以 ,因为void* 可以接受任何指针类型的赋值
p = p1;// 不行,因为不可以将void*赋值给任何实体类型的指针

  1. #include<iostream>
  2. using namespace std;
  3. int main(void){
  4. int a =3;//声明了一个整形变量 a 并且给它赋予初值 3 ,此时 变量 a=3
  5. int b = 4; //声明了一个整形变量 b 并且给它赋予初值 4,此时 变量 b=4
  6. cout << "a=" << a << endl;
  7. cout << "b=" << b << endl;
  8. int * p1 = & a ;//声明了一个 整形指针变量p1 并且把 a变量的地址赋给p1,此时p1 指向变量a
  9. int * p2 = & b;//声明了一个整形变量p2并且把b变量的地址赋给p2 此时p2 指向变量b
  10. //输出p1 的值 也就是p1 的地址
  11. cout<< " p1的值: " << p1 << endl;
  12. // 输出a的地址
  13. cout <<" a的地址:"<< static_cast< const void* > (&a) << endl;
  14. p1 = p2 ;//把p2 的地址赋值给p1 此时p1,p2 都指向了变量b 的地址(可以进行赋值,因为 指针变量p1 和指针变量p2 都是 int* 类型)
  15. cout<< "p1 的值:" << p1 << endl;
  16. cout << "p2 的值:" << p2 << endl;
  17. //输出变量b的地址
  18. cout<< "b 的地址 :"<< static_cast<const void* >(&b)<< endl;
  19. float c = 4.0; // 声明了一个float类型的变量c 并且赋予初值 4.0
  20. float* p3 = & c ;//声明了一个float类型的指针p3,并且把变量c的地址赋值给p3
  21. cout<<"p3的值:" << p3 << endl;
  22. cout<<"变量c 的地址:"<< static_cast<const void*>(&c)<<endl;// 输出变量c的地址值
  23. //p1 = p3;//试图把 float* 类型的指针变量赋值给 int* 类型(失败)
  24. //强制类型转换 :把指向float* 类型的p3 强制转换为 int* 然后在赋值给 指向int* 的p1 ,此时p1 ,p3 ,&c 都是同一地址
  25. p1 = (int*)(p3);
  26. cout<< "p1的值:" << p1 << endl;// 输出p1 的值
  27. cout<< "p3的值:" << p3 << endl;// 输出指针p3 的值
  28. cout<< "c的地址:"<< static_cast<const void*>(&c) << endl;// 输出变量 c的地址
  29. //是否有什么缺陷?分别输出其内存中所存的变量
  30. cout<< "p1内存中所存的变量值:"<< *p1 << endl;
  31. cout<< "p3 内存中所存的变量值:"<< *p3 << endl;
  32. cout<< " 变量c的值:" << c << endl;
  33. //由上述的运行结果可知 p1 内存中的变量值并不是 c的值 ,所以这种强制类型转换有很大的缺陷,下面进行借助void*
  34. void* p4 ;//声明了一个void*类型的指针型变量 可以接受任何类型的指针赋值,但不可以把void* 赋值给任何一种类型
  35. p4 = p2; //讲一个 指向整形变量的指针int*的变量 p2赋值给 void* 类型的指针型变量, 此时p2 p4 都指向了p2 也就是b的地址
  36. cout <<"p2的值:"<< p2 << endl;
  37. cout << "p4的值:"<< p4 << endl;
  38. cout <<" 变量b的地址值:"<< static_cast<const void* >(&b)<< endl;
  39. //分别通过解地址法 *p4 ,*p2 获得p4,p2的内容
  40. //cout<<"p4所指内存中所存的变量值:"<<*p4 << endl;
  41. //void* 不能进行任何指针类型的操作(如 解地址*p4)
  42. cout<<"p2所指内存中所存的变量值:"<< *p2 << endl;
  43. cout << " b的值: " << b << endl;
  44. //p2 = p4;
  45. // 这一句会出现语法错误 ,报错为 不能将”void*“类型的值 分配到 ”int*“类型的实体
  46. getchar();// 等待从键盘中输入一个值目的用来观察打印在屏幕上的值
  47. return 0;
  48. }

发表评论

表情:
评论列表 (有 0 条评论,301人围观)

还没有评论,来说两句吧...

相关阅读

    相关 voidvoid指针解析

    一)基本概念     void 类型:空类型,用于特殊目的的没有操作,也没有值的类型。不能被显式或隐式的转换为任意非空类型,可以通过强制类型转换为void类型。   ...

    相关 void指针(void *的用法)

    指针有两个属性:指向变量/对象的地址和长度 但是指针只存储地址,长度则取决于指针的类型 编译器根据指针的类型从指针指向的地址向后寻址 指针类型不同则寻址范围也不同,

    相关 void void*

    空类型 void 空类型指针void\ 总结: 1. 什么是void void 是空类型 ,不指向任何类型 ,用在两个地方: (1) 当函数不返回任何值时 函数的返