0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是void指针

汽车电子技术 来源:玩转单片机 作者:noah 2023-02-13 15:02 次阅读

C语言中,*类型就是指针类型,比如 int *p,double q,虽然是不一样的指针,但是大小却一样sizeof(p) == sizeof(q),因为它们都是同一种类型类型的。C语言是强类型的语言,对类型的区分十分严格,不同的类型占据的空间大小不同,地址偏移量也会不同;

| 基本认识

  • void可以指向任何类型的地址,但是带类型的指针不能指向void的地址
  • void*指针只有强制类型转换以后才可以正常取值
  • void*指针变量和普通指针一样可以通过等于0或者NULL来初始化,表示一个空指针
  • 当void*指针作为函数的输入和输出时,表示可以接受任意类型的输入指针和输出任意类型的指针
#include "stdio.h"


void *test(void *buff)
{
      return buff;
}


int main()
{
      int nums[] = {3, 5, 6, 7, 9};
      // 初始化指针
      void *p1 = NULL;
      p1 = nums;


      // 打印地址
      printf("%d\\n", p1);


      // 取值(报错)
      // printf("%d\\n", *p1);
      // 取值(正常)
      printf("%d\\n", *(int *)p1);


      // 地址偏移(警告)
      // printf("%d\\n", ++p1);
      // 地址偏移(正常)
      int *p2 = (int *)p1;
      printf("%d\\n", p2++);
}

| 典型应用

void*类型的指针其实本质就是一个过渡型的指针状态,在编写框架的时候就可以在不确定输入的时候使用,典型的应用有两种:

函数传参时不确定类型,或者要支持多类型的传参

void function(int dataType, void* data) {
    // 根据dataType的不同值,进行不同的转换
    switch (dataType) {
        case 0:
            int* a = (int*)data;
        case 1:
            char* a = (char*)data;
        ...
    }
}

当函数的返回值不考虑类型指关心大小的时候

void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );

| 函数指针

各位第一眼看到下边的函数有什么想法,是不是有种熟悉又陌生的感觉:

typedef void (*fun)(void *data1);

看看下面的用法:

#include "stdio.h"


// 定义一个函数类型
typedef void (*fun)(void *data1);


// 实例一个函数变量
fun test;


// 定义一个回调函数
void callBack(void *p1)
{
    printf("%d\\n", *(int *)p1);
}


int main()
{
    int a = 10;
    test = callBack;
    test(&a);
}

--END--

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136117
  • 指针
    +关注

    关注

    1

    文章

    479

    浏览量

    70506
  • sizeof
    +关注

    关注

    0

    文章

    9

    浏览量

    6435
收藏 人收藏

    评论

    相关推荐

    void指针简述

    为何在这里单独提到空指针类型呢?主要是因为该指针类型很特殊。void类型很容易让人想到是空的意思,但对于指针而言,其并不是指空,而是指不确定。在很多时候
    的头像 发表于 09-09 08:57 1664次阅读
    <b class='flag-5'>void</b><b class='flag-5'>指针</b>简述

    C语言中void指针的基本认识及典型应用

    C语言中,*类型就是指针类型,比如 int *p,double *q,虽然是不一样的指针,但是大小却一样sizeof(p) == sizeof(q),因为它们都是同一种类型*类型的。C语言是强类型的语言,对类型的区分十分严格,不同的类型占据的空间大小不同,地址偏移量也会不
    发表于 02-01 09:26 1056次阅读

    C语言教程第25集void指针和NULL指针(P25)

    C语言编程语言
    电子学习
    发布于 :2023年02月01日 16:59:42

    请问如何传入void *指针给dll函数

    Labview新手,要调用dll中的一个函数,它接收一个void *指针,然后把地址传出来。我接着要用这个地址传给它的另外一个函数。c语言的调用是这样的。void *ptr.A(&ptr);B(ptr);请问labview该如何
    发表于 05-02 13:57

    IAR和Keil中void *指针编译提示错误

    void *p;int FuncInt(int x,int y){return 1;}int main(void){p = FuncInt;}上面这段代码在Keil里面没有错误和警告,在IAR里面
    发表于 12-29 09:42

    【设计技巧】指针的使用注意事项:空指针指针赋值、void *指针

    的类型多么复杂,比如一个特别大的结构体,它的指针和一个 char型指针的大小本质上是一样的,因为指针就是起始地址。 正式由于这个原因,(void )型
    发表于 08-20 08:30

    谈谈void指针的一些妙用

    关注+星标公众号,不错过精彩内容转自 | 嵌入式客栈要比较灵活的使用C语言实现一些高层级的框架时,需要掌握一些进阶编程技巧,这篇来谈谈void指针的一些妙用。测试环境采用 IAR for ...
    发表于 01-26 07:20

    什么是void指针void指针有何功能

    [导读] 要比较灵活的使用C语言实现一些高层级的框架时,需要掌握一些进阶编程技巧,这篇来谈谈void指针的一些妙用。测试环境采用 IAR for ARM 8.40.1什么是void指针
    发表于 02-21 06:01

    C语言voidvoid指针深层探索

    1.概述 本文将对void关键字的深刻含义进行解说,并详述voidvoid指针类型的使用方法与技巧。 2.void的含义
    发表于 09-21 11:36 166次下载

    深入了解void指针背后的机理

    当使用关键字void声明指针变量时,它将成为通用指针变量。任何数据类型(char,int,float等)的任何变量的地址都可以赋值给void指针
    发表于 05-06 09:49 1339次阅读

    浅谈void指针的高阶用法

    要比较灵活的使用C语言实现一些高层级的框架时,需要掌握一些进阶编程技巧,这篇来谈谈void指针的一些妙用。测试环境采用 IAR for ARM 8.40.1 什么是void指针
    的头像 发表于 08-09 15:54 1602次阅读
    浅谈<b class='flag-5'>void</b> 型<b class='flag-5'>指针</b>的高阶用法

    STM32编程:void指针高阶用法举例,设计一个通用掉电存储子系统

    [导读] 要比较灵活的使用C语言实现一些高层级的框架时,需要掌握一些进阶编程技巧,这篇来谈谈void指针的一些妙用。测试环境采用 IAR for ARM 8.40.1什么是void指针
    发表于 12-27 18:47 10次下载
    STM32编程:<b class='flag-5'>void</b><b class='flag-5'>指针</b>高阶用法举例,设计一个通用掉电存储子系统

    STM32编程:void指针高阶用法

    [导读] 要比较灵活的使用C语言实现一些高层级的框架时,需要掌握一些进阶编程技巧,这篇来谈谈void指针的一些妙用。测试环境采用 IAR fo...
    发表于 02-07 11:14 2次下载
    STM32编程:<b class='flag-5'>void</b><b class='flag-5'>指针</b>高阶用法

    一文揭秘C语言的void指针

    void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据。和用int表示指针异曲同工,只是更明确是“指针”。
    的头像 发表于 02-02 17:18 1508次阅读

    void指针的特性介绍

    普通类型指针,包含两个方面,一个是指向此类型变量的地址,另外一个是指向变量的长度。
    的头像 发表于 03-14 14:44 821次阅读