C/C++:void和void*的区别

本文解释了C/C++中的void和void*关键字,void用于无类型函数和指针,而void*是通用指针。讨论了两者在定义、运算和编译器行为上的差异,以及sizeof操作在不同平台的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

void:

void*:

思考题:


 

voidvoid* 都是 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;
}

思考题:

思考此代码在vs2019Linux平台下的输出结果:

#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 字节

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bright_汉堡包

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值