void*的用法【转】

void指针一般被称为通用指针或叫泛指针。它是C语言关于纯粹地址的一种约定。当某个指针是void型指针时,所指向的对象不属于任何类型。

1、void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据。
和用int表示指针异曲同工,只是更明确是“指针”。

因此void*只能表示一个地址,不能用来&取值,也不能+±-移动指针,因为不知道多少字节是一个数据单位。

2、void *就是一个不能动的“地址”,在进行&、移动指针之前必须转型为类型指针。

3、指针在只知道内存,但是不知道是什么类型的时候。

4、在C/C++中,在任意时刻都可以使用其它类型指针来代替void指针,或者用void指针来代替其他类型指针。

5、对指针变量的解引用,使用间接运算符*达到目的。但是在使用空指针的情况下,需要转换指针变量以解引用。这是因为空指针没有与之关联的数据类型。编译器无法知道void指针指向的数据类型。因此,要获取由void指针指向的数据,需要使用在void指针位置内保存的正确类型的数据进行类型转换。

#include<stdio.h>

int main()
{
    int nums[] = {1,2,3,4,5};

    void *ptr1 = nums;

    //printf("*ptr1 = %d\n",*ptr1);//这样解引用的代码会报错

    int *ptr2 = nums;

    printf("*ptr2 = %d\n",*ptr2);//ptr2的类型为(int *),正常运行

    int *ptr3 = (int*)ptr1;//将ptr1从(void *)强转为(int *)以后,这样就赋予了
                           //void*一个数据类型指针,可以指向内存的值了

    printf("*ptr3 = %d\n",*ptr3);//等效于printf("*ptr2 = %d\n",*ptr2)

    printf("ptr1 = %p,ptr2 = %p\n",ptr1,ptr2);//我们发现void *类型和int *类型指向
                                            //的内存是一样的,



    return 0;
}


因此:
**1.void型指针解引用须做类型指定。
2.类型转换的时候须注意类型匹配。
3.另外,如果函数类型可以是任意类型的指针,则需将其参数定义为void *指针
比如memset函数的原型:void *memset(void *s, int ch, size_t n);
**

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值