含义
void*含义是“指向未知类型对象的指针”。
注意
- 除了函数指针、指向类成员的指针外,指向任意类型对象的指针都能被赋给一个void*类型的变量
- void*可以和其他类型的指针比较大小
- void*可转换为其他指针类型,但可能不安全
实验
#include<stdio.h>
#include<iostream>
int main() {
int a = INT_MAX - 100000000;
int* ptr_int1 = &a;
// 将int*转换为void*,ptr_void1 == ptr_int1
// ptr_int1指向的字节序列为ff 1e 0a 7a
// ptr_void指向的字节序列为ff 1e 0a 7a cc cc cc cc ...(cc为填充字节,因为类型未知,无法确定字节数)
void* ptr_void1 = ptr_int1;
// 将void*转换为int*,ptr_int2 == ptr_void1
// ptr_int2指向的字节序列为ff 1e 0a 7a
int* ptr_int2 = static_cast<int*>(ptr_void1);
// 将void*转换为float*,ptr_float == ptr_void
// ptr_float指向的字节序列为ff 1e 0a 7a
// *ptr_int1 != ptr_float
float* ptr_float = static_cast<float*>(ptr_void1);
std::cout << "a is " << a << std::endl;
std::cout << "*ptr_float is " << *ptr_float << std::endl;
// 大小为2的数组
// a[0]对应的字节序列ff 1e 0a 7a
// a[1]对应的字节序列00 00 00 00
int b[2]{ INT_MAX - 100000000, 0 };
// 将数组第一个元素的地址(int*)转换为void*,ptr_void2 == b
// void*指向的字节序列为ff 1e 0a 7a 00 00 00 00 cc cc cc...
void* ptr_void2 = b;
std::cout << b[0] << std::endl;
// 将void*转换为double*,ptr_double == ptr_void2
// double*指向的字节序列为ff 1e 0a 7a 00 00 00 00
// *ptr_double != b[0]
double* ptr_double = static_cast<double*>(ptr_void2);
std::cout << "b[0] is " << b[0] << std::endl;
std::cout << "b[1] is " << b[1] << std::endl;
std::cout << "*ptr_double is " << * ptr_double << std::endl;
return 0;
}
程序输出结果