最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解C語言的void*

 更新時間:2025年01月20日 09:24:48   作者:線程A  
本文主要介紹了C語言的void*,包括它的任意性、編譯器對void*的類型檢查以及需要顯式類型轉(zhuǎn)換的規(guī)則,具有一定的參考價值,感興趣的可以了解一下

一、void* 的類型任意性

void* 是一種通用指針類型。它可以指向任意類型的數(shù)據(jù)。例如,它可以指向一個整數(shù)(int)、一個浮點數(shù)(float)、一個字符(char)或者一個結(jié)構(gòu)體等。在C語言中,當你使用void*指針時,你不需要在編譯時指定它將指向的數(shù)據(jù)類型。這使得void* 在一些需要通用指針的場景下非常有用,比如在內(nèi)存分配函數(shù)malloc中返回的就是void*類型的指針。因為malloc函數(shù)不知道用戶將要分配的內(nèi)存用于存儲哪種類型的數(shù)據(jù),所以它返回一個void*指針,用戶可以根據(jù)自己的需要將其轉(zhuǎn)換為特定類型的指針。
例如:

void* ptr = malloc(10 * sizeof(int));
int* intPtr = (int*)ptr;  // 將void*指針轉(zhuǎn)換為int*指針

在這個例子中,void*指針 ptr 可以指向分配的內(nèi)存區(qū)域,然后通過類型轉(zhuǎn)換將其轉(zhuǎn)換為int*指針,用于存儲整數(shù)數(shù)組。

二、編譯器對 void* 的類型檢查

編譯時不做類型檢查(針對void*本身)編譯器在編譯時不會對void*指針本身進行類型檢查。因為 void* 表示“未知類型”的指針,編譯器無法知道它實際指向的數(shù)據(jù)類型。所以,當你對void指針進行操作(如賦值等)時,編譯器不會檢查其指向的數(shù)據(jù)類型是否正確。例如,你可以將一個指向整數(shù)的指針賦值給void指針,也可以將一個指向字符的指針賦值給void*指針,編譯器都不會報錯。

int a = 10;
char b = 'k';
void* vp1 = &a;
void* vp2 = &b;

在這個例子中,vp1和vp2都是void*指針,分別指向了不同類型的變量a和b,編譯器不會對這種賦值操作進行類型檢查。

三、需要顯式類型轉(zhuǎn)換

當你想要使用 void* 指針訪問其中的某個值時,通常需要先將其轉(zhuǎn)換為特定類型的指針,然后通過轉(zhuǎn)換后的指針來訪問值。在轉(zhuǎn)換時,你需要明確指定目標類型,編譯器會對轉(zhuǎn)換后的指針類型進行檢查。例如,如果你想通過 void* 指針訪問一個整數(shù)的值,你需要先將其轉(zhuǎn)換為 int* 指針。
例如:

void* vp = malloc(sizeof(int));
*(int*)vp = 20;  // 先將void*轉(zhuǎn)換為int*,然后通過int*指針賦值

在這個例子中,vp是一個void*指針,指向分配的內(nèi)存。在給這塊內(nèi)存賦值之前,需要先將其轉(zhuǎn)換為int*指針。如果轉(zhuǎn)換的目標類型和實際存儲的數(shù)據(jù)類型不匹配,可能會導致運行時錯誤。 比如,如果這塊內(nèi)存實際上存儲的是一個浮點數(shù),而你將其轉(zhuǎn)換為int*指針并訪問,可能會得到錯誤的結(jié)果或者引發(fā)程序異常。編譯器在轉(zhuǎn)換時會檢查語法是否正確(如是否有合適的類型轉(zhuǎn)換操作),但對于類型轉(zhuǎn)換的正確性(即是否符合程序的實際邏輯)主要依賴于程序員的正確使用。

占用的字節(jié)

一、32位系統(tǒng)
在32位系統(tǒng)中,void* 指針通常占據(jù)4個字節(jié)。這是因為32位系統(tǒng)中的內(nèi)存地址空間是2的32次方(即4GB),用4個字節(jié)(32位)就可以表示一個內(nèi)存地址。例如,在一個32位的Windows系統(tǒng)或者32位的Linux系統(tǒng)上,無論是void指針,還是其他類型的指針(如int、char*等),它們都占據(jù)4個字節(jié)。這4個字節(jié)存儲的是一個內(nèi)存地址,這個地址可以指向進程地址空間內(nèi)的任意位置。

二、64位系統(tǒng)
在64位系統(tǒng)中,void* 指針通常占據(jù)8個字節(jié)。64位系統(tǒng)有更大的內(nèi)存地址空間,理論上可以達到2的64次方字節(jié)。因此,需要用8個字節(jié)(64位)來表示一個完整的內(nèi)存地址。在64位系統(tǒng)上,無論是 void* 指針,還是其他類型的指針,它們的大小都是8個字節(jié)。這使得64位系統(tǒng)能夠訪問更大的內(nèi)存空間,支持更大的數(shù)據(jù)處理和更復雜的程序運行。

四、總結(jié)

通過我們上面的介紹, 我們發(fā)現(xiàn) void* 在 C 語言中是經(jīng)常使用的, 它主要有下面這幾個方案:

  • 第一個方案就是作為結(jié)構(gòu)體的字段, 這樣我們可以去表示對應(yīng)的范型字段
  • 函數(shù)的參數(shù), 或者返回值, 但是我覺得這種最好少用, 因為導致對應(yīng)的接口不夠明確
  • 各種內(nèi)存相關(guān)的函數(shù), 這其實就是一個很奇妙的東西, 因為在操作系統(tǒng)級別, 我們并不知道這塊內(nèi)存到底是什么類型的變量

約定: 當我們在使用 void* 的時候, 我們最好弄清楚當前這個指針指向的信息, 可以通過明確的變量名來完成

到此這篇關(guān)于深入理解C語言的void*的文章就介紹到這了,更多相關(guān)C語言 void*內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • Qt如何設(shè)置窗口屏幕居中顯示以及設(shè)置大小

    Qt如何設(shè)置窗口屏幕居中顯示以及設(shè)置大小

    這篇文章主要介紹了Qt如何設(shè)置窗口屏幕居中顯示以及設(shè)置大小的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 如何判斷一個數(shù)是否為2的冪次方?若是,并判斷出來是多少次方?

    如何判斷一個數(shù)是否為2的冪次方?若是,并判斷出來是多少次方?

    本篇文章是對如何判斷一個數(shù)是否為2的冪次方?若是,并判斷出來是多少次方的實現(xiàn)方法,進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++ stringstream格式化輸出輸入詳情

    C++ stringstream格式化輸出輸入詳情

    這篇文章主要介紹了C++ stringstream格式化輸出輸入,首先string str; cin>>str;遇到空格結(jié)束;于是乎產(chǎn)生了getline(),可與得到一行字符串;空格自動去掉,下面來看看文章的詳細內(nèi)容,需要的小伙伴可以參考一下
    2021-11-11
  • 一文詳解C語言操作符

    一文詳解C語言操作符

    這篇文章主要詳細介紹了C語言的操作符,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new)

    C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new)

    這篇文章主要介紹了C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • VSCode配置C語言環(huán)境的方法

    VSCode配置C語言環(huán)境的方法

    這篇文章主要介紹了VSCode配置C語言環(huán)境的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • c語言算術(shù)運算符越界問題解決方案

    c語言算術(shù)運算符越界問題解決方案

    大量的安全漏洞是由于計算機算術(shù)運算的微妙細節(jié)引起的, 具體的C語言, 諸如符號數(shù)和無符號數(shù)之間轉(zhuǎn)換, 算術(shù)運算的越界都會導致不可預(yù)知的錯誤和安全漏洞, 具體的案例數(shù)不勝數(shù).
    2012-11-11
  • C++中allocator類使用示例

    C++中allocator類使用示例

    大家好,本篇文章主要講的是C++中allocator類使用示例,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • C++之多態(tài)(內(nèi)容不錯)

    C++之多態(tài)(內(nèi)容不錯)

    什么是多態(tài)?顧名思義就是同一個事物在不同場景下的多種形態(tài),需要的朋友可以參考下
    2020-01-01
  • 使用Matlab制作大富翁小游戲的過程詳解

    使用Matlab制作大富翁小游戲的過程詳解

    大富翁大家都玩過,走到建筑的位置可以買地,第二圈走到買過的地可以升級,別人經(jīng)過后需要付過路費,每次經(jīng)過起點都會獲得一定資金,玩到最后還沒破產(chǎn)的就是勝者,本文將制作一個Matlab版的大富翁小游戲,需要的可以參考一下
    2022-02-02

最新評論

赤峰市| 清新县| 金塔县| 温州市| 洛隆县| 山东| 田林县| 兰坪| 延长县| 新闻| 新营市| 黄浦区| 陆良县| 凉城县| 德令哈市| 循化| 汉源县| 额敏县| 新蔡县| 贡山| 丰县| 罗田县| 嘉荫县| 梁河县| 阳山县| 明溪县| 青河县| 镇远县| 赞皇县| 浮山县| 西和县| 曲靖市| 上虞市| 富锦市| 抚顺市| 苏尼特左旗| 察隅县| 洛川县| 扎赉特旗| 山东省| 界首市|