读嵌入式C语言精华随笔_5(void 及void 指针深层探索)

void指针在C语言中扮演着重要角色,它能指向任何类型的数据,常用于函数参数和返回值以实现通用性。例如,memcpy和memset函数就使用void*参数来处理不同类型的内存操作。void体现了一种抽象,不能直接定义void变量,它的存在是为了抽象和泛化的功能需求。正确理解和使用void*有助于编写更加灵活的代码。
摘要由CSDN通过智能技术生成
  • void 的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
  • void 真正发挥的作用在于:
    (1) 对函数返回的限定;
    (2) 对函数参数的限定。
  • 如果函数的参数可以是任意类型指针,那么应声明其参数为void *

典型的如内存操作函数memcpy 和memset 的函数原型分别为:

void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
这样,任何类型的指针都可以传入memcpy 和memset 中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。如果memcpy 和memset 的参数类型不是void *,而是char *,那才叫真的奇怪了!这样的memcpy 和memset 明显不是一个“纯粹的,脱离低级趣味的”函数!
下面的代码执行正确:
//示例:memset 接受任意类型指针
int intarray[100];
memset ( intarray, 0, 100*sizeof(int) ); //将intarray 清0
//示例:memcpy 接受任意类型指针
int intarray1[100], intarray2[100];
memcpy ( intarray1, intarray2, 100*sizeof(int) ); //将intarray2 拷贝给intarray1
有趣的是,memcpy 和memset 函数返回的也是void *类型,标准库函数的编写者是多么地富有学问啊!

  • void 不能代表一个真实的变量
    下面代码都企图让void 代表一个真实的变量,因此都是错误的代码:
    void a; //错误
    function(void a); //错误
    void 体现了一种抽象,这个世界上的变量都是“有类型”的,譬如一个人不是男人就是女人(还有人妖?)。
    void 的出现只是为了一种抽象的需要,如果你正确地理解了面向对象中“抽象基类”的概念,也很容易理解void 数据类型。正如
    不能给抽象基类定义一个实例,我们也不能定义一个void(让我们类比的称void 为“抽象数据类型”)变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值