电商网站国内外需求分析,公司注册资金实缴后多久可以取出,网站流量作用,wordpress首页评论一、void* 的类型任意性
void* 是一种通用指针类型。它可以指向任意类型的数据。例如#xff0c;它可以指向一个整数#xff08;int#xff09;、一个浮点数#xff08;float#xff09;、一个字符#xff08;char#xff09;或者一个结构体等。在C语言中#xff0c;当…一、void* 的类型任意性
void* 是一种通用指针类型。它可以指向任意类型的数据。例如它可以指向一个整数int、一个浮点数float、一个字符char或者一个结构体等。在C语言中当你使用void*指针时你不需要在编译时指定它将指向的数据类型。这使得void* 在一些需要通用指针的场景下非常有用比如在内存分配函数malloc中返回的就是void*类型的指针。因为malloc函数不知道用户将要分配的内存用于存储哪种类型的数据所以它返回一个void*指针用户可以根据自己的需要将其转换为特定类型的指针。 例如
void* ptr malloc(10 * sizeof(int));
int* intPtr (int*)ptr; // 将void*指针转换为int*指针在这个例子中void*指针 ptr 可以指向分配的内存区域然后通过类型转换将其转换为int*指针用于存储整数数组。
二、编译器对 void* 的类型检查
编译时不做类型检查针对void*本身编译器在编译时不会对void*指针本身进行类型检查。因为 void* 表示“未知类型”的指针编译器无法知道它实际指向的数据类型。所以当你对void指针进行操作如赋值等时编译器不会检查其指向的数据类型是否正确。例如你可以将一个指向整数的指针赋值给void指针也可以将一个指向字符的指针赋值给void*指针编译器都不会报错。
int a 10;
char b k;
void* vp1 a;
void* vp2 b;在这个例子中vp1和vp2都是void*指针分别指向了不同类型的变量a和b编译器不会对这种赋值操作进行类型检查。
三、需要显式类型转换
当你想要使用 void* 指针访问其中的某个值时通常需要先将其转换为特定类型的指针然后通过转换后的指针来访问值。在转换时你需要明确指定目标类型编译器会对转换后的指针类型进行检查。例如如果你想通过 void* 指针访问一个整数的值你需要先将其转换为 int* 指针。 例如
void* vp malloc(sizeof(int));
*(int*)vp 20; // 先将void*转换为int*然后通过int*指针赋值在这个例子中vp是一个void*指针指向分配的内存。在给这块内存赋值之前需要先将其转换为int*指针。如果转换的目标类型和实际存储的数据类型不匹配可能会导致运行时错误。 比如如果这块内存实际上存储的是一个浮点数而你将其转换为int*指针并访问可能会得到错误的结果或者引发程序异常。编译器在转换时会检查语法是否正确如是否有合适的类型转换操作但对于类型转换的正确性即是否符合程序的实际逻辑主要依赖于程序员的正确使用。
占用的字节
一、32位系统 在32位系统中void* 指针通常占据4个字节。这是因为32位系统中的内存地址空间是2的32次方即4GB用4个字节32位就可以表示一个内存地址。例如在一个32位的Windows系统或者32位的Linux系统上无论是void指针还是其他类型的指针如int、char*等它们都占据4个字节。这4个字节存储的是一个内存地址这个地址可以指向进程地址空间内的任意位置。
二、64位系统 在64位系统中void* 指针通常占据8个字节。64位系统有更大的内存地址空间理论上可以达到2的64次方字节。因此需要用8个字节64位来表示一个完整的内存地址。在64位系统上无论是 void* 指针还是其他类型的指针它们的大小都是8个字节。这使得64位系统能够访问更大的内存空间支持更大的数据处理和更复杂的程序运行。
四、总结
通过我们上面的介绍, 我们发现 void* 在 C 语言中是经常使用的, 它主要有下面这几个方案:
第一个方案就是作为结构体的字段, 这样我们可以去表示对应的范型字段函数的参数, 或者返回值, 但是我觉得这种最好少用, 因为导致对应的接口不够明确各种内存相关的函数, 这其实就是一个很奇妙的东西, 因为在操作系统级别, 我们并不知道这块内存到底是什么类型的变量
约定: 当我们在使用 void* 的时候, 我们最好弄清楚当前这个指针指向的信息, 可以通过明确的变量名来完成