浅谈void 和void*
空类型 void 空类型指针void* 总结:
- 什么是void
void 是空类型 ,不指向任何类型 ,用在两个地方:
(1) 当函数不返回任何值时 函数的返回类型应该是void 而不是缺省状态,在缺省状态下函数的默认返回类型为 int
(2) 当函数不接受任何类型的参数时,参数列表应该为void 而不是 缺省状态,缺省状态是表明函数可以接受任何类型 ,任何个数的参数
如:
void fun1(void);//函数fun1 不接受任何类型的参数,函数不返回任何值
fun2();// 函数fun2可以接受任何类型任何个数的参数,函数返回值为 int 类型 - 什么是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*赋值给任何实体类型的指针
#include<iostream>
using namespace std;
int main(void){
int a =3;//声明了一个整形变量 a 并且给它赋予初值 3 ,此时 变量 a=3
int b = 4; //声明了一个整形变量 b 并且给它赋予初值 4,此时 变量 b=4
cout << "a=" << a << endl;
cout << "b=" << b << endl;
int * p1 = & a ;//声明了一个 整形指针变量p1 并且把 a变量的地址赋给p1,此时p1 指向变量a
int * p2 = & b;//声明了一个整形变量p2并且把b变量的地址赋给p2 此时p2 指向变量b
//输出p1 的值 也就是p1 的地址
cout<< " p1的值: " << p1 << endl;
// 输出a的地址
cout <<" a的地址:"<< static_cast< const void* > (&a) << endl;
p1 = p2 ;//把p2 的地址赋值给p1 此时p1,p2 都指向了变量b 的地址(可以进行赋值,因为 指针变量p1 和指针变量p2 都是 int* 类型)
cout<< "p1 的值:" << p1 << endl;
cout << "p2 的值:" << p2 << endl;
//输出变量b的地址
cout<< "b 的地址 :"<< static_cast<const void* >(&b)<< endl;
float c = 4.0; // 声明了一个float类型的变量c 并且赋予初值 4.0
float* p3 = & c ;//声明了一个float类型的指针p3,并且把变量c的地址赋值给p3
cout<<"p3的值:" << p3 << endl;
cout<<"变量c 的地址:"<< static_cast<const void*>(&c)<<endl;// 输出变量c的地址值
//p1 = p3;//试图把 float* 类型的指针变量赋值给 int* 类型(失败)
//强制类型转换 :把指向float* 类型的p3 强制转换为 int* 然后在赋值给 指向int* 的p1 ,此时p1 ,p3 ,&c 都是同一地址
p1 = (int*)(p3);
cout<< "p1的值:" << p1 << endl;// 输出p1 的值
cout<< "p3的值:" << p3 << endl;// 输出指针p3 的值
cout<< "c的地址:"<< static_cast<const void*>(&c) << endl;// 输出变量 c的地址
//是否有什么缺陷?分别输出其内存中所存的变量
cout<< "p1内存中所存的变量值:"<< *p1 << endl;
cout<< "p3 内存中所存的变量值:"<< *p3 << endl;
cout<< " 变量c的值:" << c << endl;
//由上述的运行结果可知 p1 内存中的变量值并不是 c的值 ,所以这种强制类型转换有很大的缺陷,下面进行借助void*
void* p4 ;//声明了一个void*类型的指针型变量 可以接受任何类型的指针赋值,但不可以把void* 赋值给任何一种类型
p4 = p2; //讲一个 指向整形变量的指针int*的变量 p2赋值给 void* 类型的指针型变量, 此时p2 p4 都指向了p2 也就是b的地址
cout <<"p2的值:"<< p2 << endl;
cout << "p4的值:"<< p4 << endl;
cout <<" 变量b的地址值:"<< static_cast<const void* >(&b)<< endl;
//分别通过解地址法 *p4 ,*p2 获得p4,p2的内容
//cout<<"p4所指内存中所存的变量值:"<<*p4 << endl;
//void* 不能进行任何指针类型的操作(如 解地址*p4)
cout<<"p2所指内存中所存的变量值:"<< *p2 << endl;
cout << " b的值: " << b << endl;
//p2 = p4;
// 这一句会出现语法错误 ,报错为 不能将”void*“类型的值 分配到 ”int*“类型的实体
getchar();// 等待从键盘中输入一个值目的用来观察打印在屏幕上的值
return 0;
}
还没有评论,来说两句吧...