void指针_加void与不加的区别[通俗易懂]

void指针_加void与不加的区别[通俗易懂]void指针是一种不确定类型的指针,任何指针都可转换为void指针

void指针_加void与不加的区别[通俗易懂]"

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;
}

今天的文章void指针_加void与不加的区别[通俗易懂]分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/77024.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注