指向void类型的指针

本文探讨了指向void类型的指针在C++中的特点和用法,包括它可以接受任何对象类型的指针、用于无类型参数传递和返回,以及转换回特定类型时需要注意的安全性问题。同时,文中通过示例代码展示了void指针不能直接进行间接引用、增量操作以及不安全的类型转换等限制。

指向void的指针是个非常有趣的东西,一个指向任何对象类型的指针都可以赋值给类型为void *的变量,void *可以赋值给另一个void *,两个void *可以比较是否相等(当两个指针比较时,是看它们是否指向同一块内存地址),而且可以显示的将void *转换到另一个类型。初次之外,其他任何对void *的操作都是不安全的,因为编译器不知道它实际指向哪个对象。请看下面的实例:

void f(int *pi)
{
    void *pv =pi;              //可以,从int*到void*的隐式转换
    *pv;                                             //错误:void*不能间接引用
    pv++;                                                //错误:void* 不能增量(因为不知道被指对象的大小)
    int *pi2 = static_cast<int *>(pv);    //可以,被显示的转换回int*
    double *pd1 = pv;                 //错误
    double *pd2 = pi;                                    //错误
    double *pd3 = static_cast<double *>(pv);   //不安全的
}

void*的用途有两点:

1、需要向函数传递一个指针,而又不能对对象的类型做任何假设;

2、从函数返回一个无类型的对象。要使用这样的对象就必须通过显示的类型转换。

### 介绍 在C语言中,void类型指针(`void*`)是一种通用指针,用于存放任何数据类型的引用。它是一种特殊的指针类型,可以指向任何类型的数据。它主要用于传递指针参数,或者作为函数的返回类型,以便在运行时将指针转换为适当的类型[^1]。 ### 使用方法 #### 接收任意类型的地址 可以将不同类型指针值给 `void` 指针,例如: ```c #include <stdio.h> int main() { int a = 10; short b = 20; int *p1 = &a; short *p2 = &b; // 不同类型指针值给 void 指针 void* p3 = p1; void* p4 = p2; return 0; } ``` #### 作为函数参数和返回值 `void` 指针可以作为函数参数,接收不同类型指针;也可以作为函数返回值,返回不同类型指针。 ```c #include <stdio.h> // 函数接收 void 指针作为参数 void print_value(void* ptr, char type) { if (type == 'i') { int* int_ptr = (int*)ptr; printf("%d\n", *int_ptr); } else if (type == 'f') { float* float_ptr = (float*)ptr; printf("%f\n", *float_ptr); } } // 函数返回 void 指针 void* get_address(int* num) { return (void*)num; } int main() { int num = 42; float f = 3.14; print_value(&num, 'i'); print_value(&f, 'f'); void* ptr = get_address(&num); int* int_ptr = (int*)ptr; printf("%d\n", *int_ptr); return 0; } ``` ### 相关特性 #### 不能直接解引用 `void` 指针不能直接进行解引用操作,因为编译器不知道它指向的数据类型,需要先将其转换为具体类型指针。 ```c #include <stdio.h> int main() { int a = 10; void* p = &a; // 错误示例,不能直接解引用 void 指针 // printf("%d", *p); int* int_ptr = (int*)p; printf("%d", *int_ptr); return 0; } ``` #### 不支持指针运算 `void` 指针也不能参与算术运算,因为编译器不知道指针每次移动的字节数。 ```c #include <stdio.h> int main() { int a = 10; void* p = &a; // 错误:void 指针不支持指针运算 // printf("%p", p + 1); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值