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

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

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

C進(jìn)階技巧:二級(jí)指針問(wèn)題

Q4MP_gh_c472c21 ? 來(lái)源:最后一個(gè)bug ? 作者:bug菌 ? 2020-09-08 15:00 ? 次閱讀

1、先把問(wèn)題擺出來(lái)

參考Demo:

1#include 2#include 3 4/************************************ 5*Fuction:測(cè)試demo 6*Author:(公眾號(hào):最后一個(gè)bug) 7***********************************/ 8intmain(intargc,char*argv[]){ 9inta=10; 10int*ptr=&a; 11int**ptrptr=&ptr; 12 13printf("*ptr=%d ",*ptr); 14printf("**ptrptr=%d ",**ptrptr); 15printf("**((int**)ptr)=%d ",**((int**)ptr)); 16printf("歡迎關(guān)注公眾號(hào):最后一個(gè)bug "); 17return0; 18}

運(yùn)行結(jié)果:

現(xiàn)象描述:

大家可以看到當(dāng)試圖輸出**((int **)ptr)的時(shí)候程序奔潰了,其實(shí)在bug菌剛開(kāi)始學(xué)習(xí)C的時(shí)候也是遇到了這個(gè)問(wèn)題,最終理解清楚了就自然明白了。粗暴點(diǎn)就把((int **)ptr);*((int **)ptr);**((int **)ptr)都嘗試著打印出來(lái)分析分析。

所以bug菌在下面把指針的一些知識(shí)點(diǎn)都跟大家講解一下,形成系統(tǒng)的知識(shí),避免一些小伙伴僅學(xué)習(xí)了一些碎片而一知半解。

2、二級(jí)指針的使用

1

多級(jí)指針 其實(shí)多級(jí)指針在嵌入式程序中的應(yīng)用還是相對(duì)比較少的,超過(guò)3級(jí)的bug菌僅僅只在一個(gè)特殊的索引功能里面使用過(guò)。 這里重點(diǎn)看看一、二級(jí),畢竟二級(jí)指針與我們的二維數(shù)據(jù)結(jié)合使用,二維素組在圖形、矩陣、算法等等方面還是使用非常廣泛的。

2

一級(jí)指針 指針其實(shí)廣義的講它也是一種數(shù)據(jù)類型,所以所謂的int* ptr;其中int* 就是變量ptr的類型,那么ptr就是我們常說(shuō)的指針變量。

Demo:

1#include 2#include 3/************************************ 4*Fuction:測(cè)試demo 5*Author:(公眾號(hào):最后一個(gè)bug) 6***********************************/ 7intmain(intargc,char*argv[]){ 8inta=10; 9int*ptr=&a; 10 11printf("a=%d ",a); 12printf("&ptr=0x%X ",&ptr); 13printf("&a=0x%X ",&a); 14printf("ptr=0x%X ",ptr); 15printf("*ptr=%d ",*ptr); 16 17printf("歡迎關(guān)注公眾號(hào):最后一個(gè)bug "); 18return0; 19}

運(yùn)行結(jié)果:

圖解:

分析一下:

ptr既然是變量,變量存于內(nèi)存中,那么就一定有其地址,如上圖所示ptr位于0x28FEE8地址處,其中其ptr里面保存的就是藍(lán)色區(qū)域中的地址,也就是a變量所在的地址,所以&a與ptr是相等的。

*ptr就很好理解了,你可以把*ptr看成一個(gè)變量,其類型為int,其變量位于ptr值所在的內(nèi)存地址處,即0x28FEEC處的int變量與定義的int a剛好一致。

3

二級(jí)指針 如果大家已經(jīng)理解了一級(jí)指針,二級(jí)指針也就順理成章了,來(lái)看看下面的小程序:

Demo:

1#include 2#include 3/************************************ 4*Fuction:測(cè)試demo 5*Author:(公眾號(hào):最后一個(gè)bug) 6***********************************/ 7intmain(intargc,char*argv[]){ 8inta=10; 9int*ptr=&a; 10int**ptrptr=&ptr; 11 12printf("a=%d ",a); 13 14printf("&ptrptr=0x%X ",&ptrptr); 15 16printf("ptrptr=0x%X ",ptrptr); 17printf("&*ptrptr=0x%X ",&*ptrptr); 18printf("&ptr=0x%X ",&ptr); 19 20printf("*ptrptr=0x%X ",*ptrptr); 21printf("ptr=0x%X ",ptr); 22 23printf("*ptr=%d ",*ptr); 24printf("**ptrptr=%d ",**ptrptr); 25 26printf("歡迎關(guān)注公眾號(hào):最后一個(gè)bug "); 27return0; 28}

運(yùn)行結(jié)果:

圖解:

分析一下:

通過(guò)上圖來(lái)看ptrptr也是一個(gè)變量,其類型為int**,變量肯定有內(nèi)存,其地址就是0x28FEE4,其變量保存的值是0x28FEE8(即ptr的地址)。

那么*ptrptr,同樣跟一級(jí)指針一致,把*ptrptr看成一個(gè)變量,也就是在ptrptr的值0x28FEEC8地址處的一個(gè)int*類型的變量,且該變量的值是0x28FEEC,其自身的地址為0x28FEE8。

同樣對(duì)于**ptrptr也看成變量,也就是*ptrptr的值0x28FEEC地址處的一個(gè)int類型的變量,那么此時(shí)該變量與a是相等的。

最后在解釋一下&*ptrptr,由于*ptrptr一個(gè)變量,&*ptrptr表示該變量的地址即0x28FEE8,然而該值剛好也是ptrptr變量的值,所以&*ptrptr =ptrptr。

3、是時(shí)候解答前面的問(wèn)題了

參考Demo:

1#include 2#include 3 4/************************************ 5*Fuction:測(cè)試demo 6*Author:(公眾號(hào):最后一個(gè)bug) 7***********************************/ 8intmain(intargc,char*argv[]){ 9inta=10; 10int*ptr=&a; 11int**ptrptr=&ptr; 12 13printf("*ptr=%d ",*ptr); 14printf("**ptrptr=%d ",**ptrptr); 15printf("**((int**)ptr)=%d ",**((int**)ptr)); 16printf("歡迎關(guān)注公眾號(hào):最后一個(gè)bug "); 17return0; 18}

分析一下:

我們知道問(wèn)題出在**(int**)ptr,不太理解的小伙伴總是覺(jué)得,我已經(jīng)強(qiáng)制類型轉(zhuǎn)化為二級(jí)指針了,前面只需要用**獲得最后的值即可,怎么就不行呢? 我知道這里有問(wèn)題我就是不理解為什么?

那我們一起通過(guò)前面的知識(shí)來(lái)分析分析。同樣把ptr看成是變量,變量的值并不會(huì)跟隨強(qiáng)制類型而發(fā)生改變。強(qiáng)制類型僅僅只是改變了獲取內(nèi)存中數(shù)據(jù)的方式,并沒(méi)有改變內(nèi)存中的數(shù)據(jù)。下面圖解一下:

所以本例子中對(duì)于強(qiáng)制類型轉(zhuǎn)化中的**(int*****)ptr,無(wú)論強(qiáng)制類型轉(zhuǎn)化為幾級(jí)指針都沒(méi)有絲毫意義,因?yàn)樽兞勘旧淼闹禌](méi)有發(fā)生變化!所以強(qiáng)制類型轉(zhuǎn)化以后第二個(gè)*便會(huì)指向出問(wèn)題,從而導(dǎo)致訪問(wèn)了不正確的內(nèi)存空間而程序奔潰。

多級(jí)指針強(qiáng)制類型轉(zhuǎn)化的目的大部分都是為了滿足編譯器檢查指針層級(jí)操作邏輯是否有誤。

以后大家對(duì)于多級(jí)指針的分析不太熟練的話可以跟bug菌一樣畫(huà)畫(huà)圖分析分析,基本上一些理解上的問(wèn)題就迎刃而解了。

4、最后小結(jié)

指針的理解就為大家講解到這里了,如果你對(duì)指針還有畏懼感,那就只有一個(gè)可能,使用得太少了,多加練習(xí)自然生巧!

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

    關(guān)注

    23

    文章

    4587

    瀏覽量

    92501
  • 矩陣
    +關(guān)注

    關(guān)注

    0

    文章

    418

    瀏覽量

    34475
  • 嵌入式程序
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    6523

原文標(biāo)題:C進(jìn)階技巧:二級(jí)指針這個(gè)問(wèn)題被問(wèn)好幾遍!該終結(jié)了!

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    級(jí)二級(jí)浪涌保護(hù)器的區(qū)別與選型指南

    尤為重要。地凱科技將深入分析一級(jí)二級(jí)浪涌保護(hù)器的主要區(qū)別、識(shí)別方法、選擇依據(jù)及不同行業(yè)中的細(xì)分應(yīng)用。 一級(jí)浪涌保護(hù)器與二級(jí)浪涌保護(hù)器的定義與工作原理 一
    的頭像 發(fā)表于 11-08 11:04 ?74次閱讀
    一<b class='flag-5'>級(jí)</b>和<b class='flag-5'>二級(jí)</b>浪涌保護(hù)器的區(qū)別與選型指南

    二級(jí)配電箱的作用介紹

    配電箱作為電能分配和管理的關(guān)鍵設(shè)備,發(fā)揮著至關(guān)重要的作用。二級(jí)配電箱位于一級(jí)配電箱和三級(jí)配電箱之間,起到中間分配電力的作用。本文將深入探討二級(jí)配電箱的主要特點(diǎn)和功能,為電力系統(tǒng)的優(yōu)化提
    的頭像 發(fā)表于 10-04 11:46 ?223次閱讀

    物聯(lián)網(wǎng)系統(tǒng)中如何增強(qiáng)GNSS的信號(hào)_GNSS二級(jí)放大電路研發(fā)測(cè)試方案

    01 物聯(lián)網(wǎng)行業(yè)中存在問(wèn)題 GPS 產(chǎn)品在研發(fā)階段,為優(yōu)化GNSS產(chǎn)品定位性能,增加射頻二級(jí)放大電路,需要對(duì)產(chǎn)品進(jìn)行射頻測(cè)試以及外場(chǎng)實(shí)際測(cè)試,保證達(dá)到提升GNSS產(chǎn)品定位性能,縮短定位時(shí)間,從而
    的頭像 發(fā)表于 09-30 18:25 ?286次閱讀
    物聯(lián)網(wǎng)系統(tǒng)中如何增強(qiáng)GNSS的信號(hào)_GNSS<b class='flag-5'>二級(jí)</b>放大電路研發(fā)測(cè)試方案

    INA128兩級(jí)放大,第二級(jí)放大測(cè)不出來(lái)的原因?如何解決?

    級(jí)放大 第一級(jí)放大6倍第二級(jí)放大16倍 信號(hào)源輸入2v電壓示波器顯示第一級(jí)放大只有5.2倍第二級(jí)放大測(cè)不出來(lái)當(dāng)兩
    發(fā)表于 09-12 06:51

    THS3001級(jí)聯(lián)組成放大電路,實(shí)際接通后第二級(jí)有明顯發(fā)熱,為什么?

    實(shí)際接通后第二級(jí)有明顯發(fā)熱。單獨(dú)測(cè)試第一級(jí)沒(méi)問(wèn)題,對(duì)第二級(jí)直接輸入第一級(jí)的輸出相關(guān)參數(shù)依然正常??墒莾蓧K一旦級(jí)聯(lián)第二級(jí)就發(fā)熱。
    發(fā)表于 09-06 06:08

    OPA388作為儀表放大,第二級(jí)輸出總是差點(diǎn),為什么?

    如圖,第二級(jí)放大總是比2倍差一點(diǎn)。
    發(fā)表于 08-05 08:08

    級(jí)浪涌保護(hù)器和二級(jí)浪涌保護(hù)器怎么區(qū)分

    級(jí)浪涌保護(hù)器和二級(jí)浪涌保護(hù)器是電力系統(tǒng)中非常重要的保護(hù)設(shè)備,它們的主要作用是保護(hù)電力系統(tǒng)免受雷電、操作過(guò)電壓等浪涌電壓的損害。在電力系統(tǒng)中,浪涌保護(hù)器的設(shè)置和選擇對(duì)于系統(tǒng)的安全穩(wěn)定運(yùn)行
    的頭像 發(fā)表于 07-13 14:44 ?4402次閱讀

    二級(jí)浪涌保護(hù)器型號(hào)如何選擇

    選擇二級(jí)浪涌保護(hù)器型號(hào)時(shí),需要綜合考慮多個(gè)因素,以確保所選型號(hào)能夠滿足電器系統(tǒng)的實(shí)際需求。以下是一些關(guān)鍵步驟和考慮因素: 一、了解系統(tǒng)需求 電壓等級(jí) :首先,明確您的電器系統(tǒng)的電壓等級(jí),這是選擇浪涌
    的頭像 發(fā)表于 07-13 14:25 ?689次閱讀

    HarmonyOS開(kāi)發(fā)案例:【卡片二級(jí)聯(lián)動(dòng)】

    使用ArkTS語(yǔ)言,實(shí)現(xiàn)一個(gè)導(dǎo)航與內(nèi)容二級(jí)聯(lián)動(dòng)的效果。
    的頭像 發(fā)表于 05-06 17:08 ?501次閱讀
    HarmonyOS開(kāi)發(fā)案例:【卡片<b class='flag-5'>二級(jí)</b>聯(lián)動(dòng)】

    OLED設(shè)備公司DMS最近對(duì)二級(jí)分包商A公司提起訴訟

    WitDisplay消息,OLED設(shè)備公司DMS最近對(duì)二級(jí)分包商A公司提起訴訟,要求支付150億韓元(8100萬(wàn)元人民幣)的過(guò)度延誤賠償。
    的頭像 發(fā)表于 02-29 15:40 ?658次閱讀

    ESD極管是什么?如何選擇合適電容值的ESD二級(jí)管?

    作為一名關(guān)注通信接口和電子元器件的專業(yè)人士,你一定對(duì)ESD(Electrostatic Discharge)極管非常感興趣。讓我們一起來(lái)了解一下ESD極管是什么,以及如何選擇合適電容值的ESD二級(jí)管吧。
    的頭像 發(fā)表于 02-21 17:06 ?2558次閱讀
    ESD<b class='flag-5'>二</b>極管是什么?如何選擇合適電容值的ESD<b class='flag-5'>二級(jí)</b>管?

    二級(jí)電源和II級(jí)電源的區(qū)別

    二級(jí)電源和II級(jí)電源的區(qū)別 隨著電力需求的不斷增長(zhǎng),人們對(duì)電源的要求也越來(lái)越高。二級(jí)電源和II級(jí)電源是兩種常見(jiàn)的電源等級(jí),它們?cè)谝恍╆P(guān)鍵的技術(shù)規(guī)范上存在一些區(qū)別。 首先,我們來(lái)了解一下
    的頭像 發(fā)表于 01-19 13:51 ?1862次閱讀

    級(jí)浪涌保護(hù)器和二級(jí)浪涌保護(hù)器的區(qū)別是什么?

    級(jí)浪涌保護(hù)器和二級(jí)浪涌保護(hù)器的區(qū)別是什么? 一級(jí)浪涌保護(hù)器和二級(jí)浪涌保護(hù)器是電氣設(shè)備中常用的保護(hù)裝置,用于保護(hù)設(shè)備免受浪涌電壓的影響。浪涌保護(hù)器通常被安裝在電源線路上,以限制過(guò)電壓對(duì)
    的頭像 發(fā)表于 01-18 16:22 ?3994次閱讀

    常用二級(jí)管的特性及標(biāo)識(shí)

    極管的應(yīng)用非常廣泛,幾乎絕大部分電路板上都極管的身影。今天就來(lái)講講常用二級(jí)管特性及標(biāo)識(shí)。
    的頭像 發(fā)表于 01-11 09:47 ?1215次閱讀
    常用<b class='flag-5'>二級(jí)</b>管的特性及標(biāo)識(shí)

    mybatis一級(jí)緩存和二級(jí)緩存的原理

    MyBatis是一種輕量級(jí)的持久化框架,它提供了一級(jí)緩存和二級(jí)緩存的機(jī)制來(lái)優(yōu)化數(shù)據(jù)庫(kù)操作性能。一級(jí)緩存是默認(rèn)開(kāi)啟的,而二級(jí)緩存需要手動(dòng)配置啟用。 一、一
    的頭像 發(fā)表于 12-03 11:55 ?1056次閱讀