void指针

本文探讨了void指针的特性,如何仅保存内存地址而忽略类型,并强调了在使用时必须进行类型转换的重要性。通过实例展示了void指针在操作数组和类型转换中的应用,以及正确和错误的使用方式。

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

void指针是一种不明确类型的指针,任何指针都可转换为void指针。

前面的文章说过,指针有两个非常重要的信息:

  1. 指针的值(指针目标对象的内存首地址)
  2. 指针指向对象的类型

注意点:void指针只保存了 指针的值 并没有记录 指针指向对象的类型。因此在用到对void指针解引时,需要先把void指针转换成原本的数据类型。

如:

int n = 500; //定义一个int变量

int * p = &n; //定义int类型指针

void * pv = p; //定义void指针,只保存了p的值(即n的内存首地址)

//错误的写法

printf("%d\n", *pv); //这里会报错,因pv指针没有明确数据类型,因此也不知道需要取多少字节的数据

//正确写法

printf("%d\n", *( (int*)pv ) ); //先把pv指针转为int类型指针,再对其解引

#include <stdio.h>
/*
时间:2022-05-03 18:08
作者:sgbl888
功能:void指针
知识点:
    1、void指针是一种不明确类型的指针,任何指针都可转为void指针
    2、void指针转换只保存了指针两个重要信息其中的一个,即只存储了 指针目标的内存首地址
    3、若需要对void指针操作,请先把void指针原先指向的类型转回来
*/
int main(){
    int n = 500;
    int * p = &n;
    void * pv = p; //只存储了指针目标的内存首地址,没有保存指针的类型
    void * pv1 = (void*)p; //强制转换成void指针,上行是隐式转换
    //printf("%d\n", *pv); //报错:dereferencing 'void *' pointer,因没有保存指针类型,编译器也不知要取多少字节的数据
    printf("%d\n", *( (int *)pv ) ); //先把pv转回int*类型,再对其取值

    //用void指针历遍一维数组
    int a[] = {1, 3, 5, 7, 9};
    void * pa = a; //等同于 &a[0] 数组名在表达式中会转为数组首元素的首地址
    for(int i = 0; i < sizeof(a) / sizeof(int); i++){
        printf("%hd\t", *( (int *)pa + i) ); //先把pa转为int类型指针,再加偏移量
        //注意,不能写成下面这样。因为pa是一个void指针,如果先对其加i就不能起到移动数组下一个元素的作用了
        //printf("%hd\t", *( (int*)(pa+i) ));
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值