0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是void指針

汽車電子技術(shù) ? 來(lái)源:玩轉(zhuǎn)單片機(jī) ? 作者:noah ? 2023-02-13 15:02 ? 次閱讀

C語(yǔ)言中,*類型就是指針類型,比如 int *p,double q,雖然是不一樣的指針,但是大小卻一樣sizeof(p) == sizeof(q),因?yàn)樗鼈兌际峭环N類型類型的。C語(yǔ)言是強(qiáng)類型的語(yǔ)言,對(duì)類型的區(qū)分十分嚴(yán)格,不同的類型占據(jù)的空間大小不同,地址偏移量也會(huì)不同;

| 基本認(rèn)識(shí)

  • void可以指向任何類型的地址,但是帶類型的指針不能指向void的地址
  • void*指針只有強(qiáng)制類型轉(zhuǎn)換以后才可以正常取值
  • void*指針變量和普通指針一樣可以通過等于0或者NULL來(lái)初始化,表示一個(gè)空指針
  • 當(dāng)void*指針作為函數(shù)的輸入和輸出時(shí),表示可以接受任意類型的輸入指針和輸出任意類型的指針
#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);


      // 取值(報(bào)錯(cuò))
      // printf("%d\\n", *p1);
      // 取值(正常)
      printf("%d\\n", *(int *)p1);


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

| 典型應(yīng)用

void*類型的指針其實(shí)本質(zhì)就是一個(gè)過渡型的指針狀態(tài),在編寫框架的時(shí)候就可以在不確定輸入的時(shí)候使用,典型的應(yīng)用有兩種:

函數(shù)傳參時(shí)不確定類型,或者要支持多類型的傳參

void function(int dataType, void* data) {
    // 根據(jù)dataType的不同值,進(jìn)行不同的轉(zhuǎn)換
    switch (dataType) {
        case 0:
            int* a = (int*)data;
        case 1:
            char* a = (char*)data;
        ...
    }
}

當(dāng)函數(shù)的返回值不考慮類型指關(guān)心大小的時(shí)候

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

| 函數(shù)指針

各位第一眼看到下邊的函數(shù)有什么想法,是不是有種熟悉又陌生的感覺:

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

看看下面的用法:

#include "stdio.h"


// 定義一個(gè)函數(shù)類型
typedef void (*fun)(void *data1);


// 實(shí)例一個(gè)函數(shù)變量
fun test;


// 定義一個(gè)回調(diào)函數(shù)
void callBack(void *p1)
{
    printf("%d\\n", *(int *)p1);
}


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

--END--

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7595

    瀏覽量

    135878
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    478

    瀏覽量

    70491
  • sizeof
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    6429
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    void指針簡(jiǎn)述

    為何在這里單獨(dú)提到空指針類型呢?主要是因?yàn)樵?b class='flag-5'>指針類型很特殊。void類型很容易讓人想到是空的意思,但對(duì)于指針而言,其并不是指空,而是指不確定。在很多時(shí)候
    的頭像 發(fā)表于 09-09 08:57 ?1660次閱讀
    <b class='flag-5'>void</b><b class='flag-5'>指針</b>簡(jiǎn)述

    C語(yǔ)言中void指針的基本認(rèn)識(shí)及典型應(yīng)用

    C語(yǔ)言中,*類型就是指針類型,比如 int *p,double *q,雖然是不一樣的指針,但是大小卻一樣sizeof(p) == sizeof(q),因?yàn)樗鼈兌际峭环N類型*類型的。C語(yǔ)言是強(qiáng)類型的語(yǔ)言,對(duì)類型的區(qū)分十分嚴(yán)格,不同的類型占據(jù)的空間大小不同,地址偏移量也會(huì)不
    發(fā)表于 02-01 09:26 ?1049次閱讀

    C語(yǔ)言教程第25集void指針和NULL指針(P25)

    C語(yǔ)言編程語(yǔ)言
    電子學(xué)習(xí)
    發(fā)布于 :2023年02月01日 16:59:42

    請(qǐng)問如何傳入void *指針給dll函數(shù)

    Labview新手,要調(diào)用dll中的一個(gè)函數(shù),它接收一個(gè)void *指針,然后把地址傳出來(lái)。我接著要用這個(gè)地址傳給它的另外一個(gè)函數(shù)。c語(yǔ)言的調(diào)用是這樣的。void *ptr.A(&ptr);B(ptr);請(qǐng)問labview該如何
    發(fā)表于 05-02 13:57

    IAR和Keil中void *指針編譯提示錯(cuò)誤

    void *p;int FuncInt(int x,int y){return 1;}int main(void){p = FuncInt;}上面這段代碼在Keil里面沒有錯(cuò)誤和警告,在IAR里面
    發(fā)表于 12-29 09:42

    【設(shè)計(jì)技巧】指針的使用注意事項(xiàng):空指針、指針賦值、void *指針

    的類型多么復(fù)雜,比如一個(gè)特別大的結(jié)構(gòu)體,它的指針和一個(gè) char型指針的大小本質(zhì)上是一樣的,因?yàn)?b class='flag-5'>指針就是起始地址。 正式由于這個(gè)原因,(void )型
    發(fā)表于 08-20 08:30

    談?wù)?b class='flag-5'>void指針的一些妙用

    關(guān)注+星標(biāo)公眾號(hào),不錯(cuò)過精彩內(nèi)容轉(zhuǎn)自 | 嵌入式客棧要比較靈活的使用C語(yǔ)言實(shí)現(xiàn)一些高層級(jí)的框架時(shí),需要掌握一些進(jìn)階編程技巧,這篇來(lái)談?wù)?b class='flag-5'>void指針的一些妙用。測(cè)試環(huán)境采用 IAR for ...
    發(fā)表于 01-26 07:20

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

    [導(dǎo)讀] 要比較靈活的使用C語(yǔ)言實(shí)現(xiàn)一些高層級(jí)的框架時(shí),需要掌握一些進(jìn)階編程技巧,這篇來(lái)談?wù)?b class='flag-5'>void指針的一些妙用。測(cè)試環(huán)境采用 IAR for ARM 8.40.1什么是void指針
    發(fā)表于 02-21 06:01

    C語(yǔ)言voidvoid指針深層探索

    1.概述 本文將對(duì)void關(guān)鍵字的深刻含義進(jìn)行解說,并詳述voidvoid指針類型的使用方法與技巧。 2.void的含義
    發(fā)表于 09-21 11:36 ?166次下載

    深入了解void指針背后的機(jī)理

    當(dāng)使用關(guān)鍵字void聲明指針變量時(shí),它將成為通用指針變量。任何數(shù)據(jù)類型(char,int,float等)的任何變量的地址都可以賦值給void指針
    發(fā)表于 05-06 09:49 ?1330次閱讀

    淺談void指針的高階用法

    要比較靈活的使用C語(yǔ)言實(shí)現(xiàn)一些高層級(jí)的框架時(shí),需要掌握一些進(jìn)階編程技巧,這篇來(lái)談?wù)?b class='flag-5'>void指針的一些妙用。測(cè)試環(huán)境采用 IAR for ARM 8.40.1 什么是void指針
    的頭像 發(fā)表于 08-09 15:54 ?1598次閱讀
    淺談<b class='flag-5'>void</b> 型<b class='flag-5'>指針</b>的高階用法

    STM32編程:void指針高階用法舉例,設(shè)計(jì)一個(gè)通用掉電存儲(chǔ)子系統(tǒng)

    [導(dǎo)讀] 要比較靈活的使用C語(yǔ)言實(shí)現(xiàn)一些高層級(jí)的框架時(shí),需要掌握一些進(jìn)階編程技巧,這篇來(lái)談?wù)?b class='flag-5'>void指針的一些妙用。測(cè)試環(huán)境采用 IAR for ARM 8.40.1什么是void指針
    發(fā)表于 12-27 18:47 ?10次下載
    STM32編程:<b class='flag-5'>void</b><b class='flag-5'>指針</b>高階用法舉例,設(shè)計(jì)一個(gè)通用掉電存儲(chǔ)子系統(tǒng)

    STM32編程:void指針高階用法

    [導(dǎo)讀] 要比較靈活的使用C語(yǔ)言實(shí)現(xiàn)一些高層級(jí)的框架時(shí),需要掌握一些進(jìn)階編程技巧,這篇來(lái)談?wù)?b class='flag-5'>void指針的一些妙用。測(cè)試環(huán)境采用 IAR fo...
    發(fā)表于 02-07 11:14 ?2次下載
    STM32編程:<b class='flag-5'>void</b><b class='flag-5'>指針</b>高階用法

    一文揭秘C語(yǔ)言的void指針

    void *表示一個(gè)“不知道類型”的指針,也就不知道從這個(gè)指針地址開始多少字節(jié)為一個(gè)數(shù)據(jù)。和用int表示指針異曲同工,只是更明確是“指針”。
    的頭像 發(fā)表于 02-02 17:18 ?1499次閱讀

    void指針的特性介紹

    普通類型指針,包含兩個(gè)方面,一個(gè)是指向此類型變量的地址,另外一個(gè)是指向變量的長(zhǎng)度。
    的頭像 發(fā)表于 03-14 14:44 ?814次閱讀