目录
void
和void*
都是 C 和 C++ 中的关键字,用于处理指针和函数的特殊类型
void
:
意义:
void
是一种特殊的数据类型,表示“无类型”或“没有值”用法: 在函数返回类型处使用
void
表示函数不返回任何,也可以作为函数的形参使用指针和
void
: 不能直接创建void
类型的指针,因为void
指针没有具体的类型信息。但可以使用void*
进行通用指针操作,如在函数中接收未知类型的指针参数。
正确例子如下:
//可以做函数的返回值,和形参
void func(void)
{
}
那么我们看这个代码运行结果是什么?
#include <stdio.h>
int main()
{
//不可以定义变量
void p; //err
//在标准C++是不可以计算的
printf("%d\n",sizeof(void));//err
return 0;
}
得出结果是:
可验证:
void 是无类型,不可以定义变量,无类型是C语言中的类型,称为抽象类型
sizeof(void):在标准C++是不可以计算的,在vs2019是不可以的,那既然这么说是不是在其他平台下是可以呢?可以看下面思考题
void*
:
意义:
void*
是一种通用指针类型,表示指向未知类型的内存地址用法: 可以存储任何类型的地址,不可以存对象,但不能直接解引用。需要强制类型转换为特定类型的指针后才能使用,也可以作为函数的返回值
void *p; //可以定义
*p; //不可以解引用
正确例子如下:
void * MyMemMove(void *dst,const void *src,int count)
{
assert(dst);
assert(src);
void * ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count)) {
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else {
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return(ret);
}
#include <stdio.h>
int main()
{
void* p;//这个是不会报错的
//在x86位是 4 字节 在x64位是 8 字节
printf("%d\n",(int)sizeof(p));
//不可以解析 因为无类型不可以解引用
printf("%d\n",(int)sizeof(*p));//err
return 0;
}
思考题:
思考此代码在vs2019和Linux平台下的输出结果:
#include <stdio.h>
int main() {
printf("void : %d\n", (int)sizeof(void)); // 获取指针大小
printf("void* : %d\n", (int)sizeof(void*)); // 获取指针大小
return 0;
}
在Linux平台下运行结果是:
sizeof(void):在 Linux 平台上得到的是
1
,这可能是因为编译器对于sizeof(void)
的结果进行了某种默认处理。但这并不是标准行为,而且在其他编译器或平台上可能会有不同的结果
sizeof(void*):表示指针在特定系统上的字节数
对于大多数 64 位的 Linux 系统,指针大小是 8 个字节(64 位),因此输出结果是 8
然而在vs2019平台下:
sizeof(void):在标准C++是不可以计算的
sizeof(void*):结果在不同的系统和编译器中可能会有所不同,因为它取决于平台的位数和编译器的实现
在 32 位系统上,
sizeof(void*)
可能为 4 字节在 64 位系统上,
sizeof(void*)
可能为 8 字节