那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C進階技巧:二級指針問題

Q4MP_gh_c472c21 ? 來源:最后一個bug ? 作者:bug菌 ? 2020-09-08 15:00 ? 次閱讀

1、先把問題擺出來

參考Demo:

1#include 2#include 3 4/************************************ 5*Fuction:測試demo 6*Author:(公眾號:最后一個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("歡迎關注公眾號:最后一個bug "); 17return0; 18}

運行結果:

現象描述:

大家可以看到當試圖輸出**((int **)ptr)的時候程序奔潰了,其實在bug菌剛開始學習C的時候也是遇到了這個問題,最終理解清楚了就自然明白了。粗暴點就把((int **)ptr);*((int **)ptr);**((int **)ptr)都嘗試著打印出來分析分析。

所以bug菌在下面把指針的一些知識點都跟大家講解一下,形成系統的知識,避免一些小伙伴僅學習了一些碎片而一知半解。

2、二級指針的使用

1

多級指針 其實多級指針在嵌入式程序中的應用還是相對比較少的,超過3級的bug菌僅僅只在一個特殊的索引功能里面使用過。 這里重點看看一、二級,畢竟二級指針與我們的二維數據結合使用,二維素組在圖形、矩陣、算法等等方面還是使用非常廣泛的。

2

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

Demo:

1#include 2#include 3/************************************ 4*Fuction:測試demo 5*Author:(公眾號:最后一個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("歡迎關注公眾號:最后一個bug "); 18return0; 19}

運行結果:

圖解:

分析一下:

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

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

3

二級指針 如果大家已經理解了一級指針,二級指針也就順理成章了,來看看下面的小程序:

Demo:

1#include 2#include 3/************************************ 4*Fuction:測試demo 5*Author:(公眾號:最后一個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("歡迎關注公眾號:最后一個bug "); 27return0; 28}

運行結果:

圖解:

分析一下:

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

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

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

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

3、是時候解答前面的問題了

參考Demo:

1#include 2#include 3 4/************************************ 5*Fuction:測試demo 6*Author:(公眾號:最后一個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("歡迎關注公眾號:最后一個bug "); 17return0; 18}

分析一下:

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

那我們一起通過前面的知識來分析分析。同樣把ptr看成是變量,變量的值并不會跟隨強制類型而發生改變。強制類型僅僅只是改變了獲取內存中數據的方式,并沒有改變內存中的數據。下面圖解一下:

所以本例子中對于強制類型轉化中的**(int*****)ptr,無論強制類型轉化為幾級指針都沒有絲毫意義,因為變量本身的值沒有發生變化!所以強制類型轉化以后第二個*便會指向出問題,從而導致訪問了不正確的內存空間而程序奔潰。

多級指針強制類型轉化的目的大部分都是為了滿足編譯器檢查指針層級操作邏輯是否有誤。

以后大家對于多級指針的分析不太熟練的話可以跟bug菌一樣畫畫圖分析分析,基本上一些理解上的問題就迎刃而解了。

4、最后小結

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4630

    瀏覽量

    93355
  • 矩陣
    +關注

    關注

    0

    文章

    425

    瀏覽量

    34643
  • 嵌入式程序
    +關注

    關注

    0

    文章

    6

    瀏覽量

    6566

原文標題:C進階技巧:二級指針這個問題被問好幾遍!該終結了!

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    CDCE62005第二級PLL無法鎖住的原因?如何解決?

    我們遇到兩片CDCE62005聯后,部分板卡第二級芯片Lock信號失鎖問題。 我們的芯片電路是完全參考TI官方6678開發板的,配置的SPI接口由FPGA控制,配置文件由官方軟件生成; 已經生產
    發表于 11-11 07:06

    二級浪涌保護器的區別與選型指南

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

    二級配電箱的作用介紹

    配電箱作為電能分配和管理的關鍵設備,發揮著至關重要的作用。二級配電箱位于一配電箱和三配電箱之間,起到中間分配電力的作用。本文將深入探討二級配電箱的主要特點和功能,為電力系統的優化提
    的頭像 發表于 10-04 11:46 ?624次閱讀

    物聯網系統中如何增強GNSS的信號_GNSS二級放大電路研發測試方案

    01 物聯網行業中存在問題 GPS 產品在研發階段,為優化GNSS產品定位性能,增加射頻二級放大電路,需要對產品進行射頻測試以及外場實際測試,保證達到提升GNSS產品定位性能,縮短定位時間,從而
    的頭像 發表于 09-30 18:25 ?552次閱讀
    物聯網系統中如何增強GNSS的信號_GNSS<b class='flag-5'>二級</b>放大電路研發測試方案

    INA128兩放大,第二級放大測不出來的原因?如何解決?

    放大 第一放大6倍第二級放大16倍 信號源輸入2v電壓示波器顯示第一放大只有5.2倍第二級放大測不出來當兩
    發表于 09-12 06:51

    THS3001聯組成放大電路,實際接通后第二級有明顯發熱,為什么?

    實際接通后第二級有明顯發熱。單獨測試第一沒問題,對第二級直接輸入第一的輸出相關參數依然正常。可是兩塊一旦級聯第二級就發熱。
    發表于 09-06 06:08

    OPA2333二級放大是否可以實現萬倍放大?

    供電電源:直流3.3v 待放大輸入電壓:10uV。 請問二級放大是否可以實現萬倍放大。如果可以,該怎樣實現?
    發表于 08-13 06:58

    OPA388作為儀表放大,第二級輸出總是差點,為什么?

    如圖,第二級放大總是比2倍差一點。
    發表于 08-05 08:08

    浪涌保護器和二級浪涌保護器怎么區分

    浪涌保護器和二級浪涌保護器是電力系統中非常重要的保護設備,它們的主要作用是保護電力系統免受雷電、操作過電壓等浪涌電壓的損害。在電力系統中,浪涌保護器的設置和選擇對于系統的安全穩定運行
    的頭像 發表于 07-13 14:44 ?5445次閱讀

    二級浪涌保護器型號如何選擇

    選擇二級浪涌保護器型號時,需要綜合考慮多個因素,以確保所選型號能夠滿足電器系統的實際需求。以下是一些關鍵步驟和考慮因素: 一、了解系統需求 電壓等級 :首先,明確您的電器系統的電壓等級,這是選擇浪涌
    的頭像 發表于 07-13 14:25 ?918次閱讀

    HarmonyOS開發案例:【卡片二級聯動】

    使用ArkTS語言,實現一個導航與內容二級聯動的效果。
    的頭像 發表于 05-06 17:08 ?636次閱讀
    HarmonyOS開發案例:【卡片<b class='flag-5'>二級</b>聯動】

    華潤微電子LX100安全MCU芯片產品榮獲商用密碼產品二級認證

    近日,華潤微電子集成電路(無錫)有限公司LX100安全MCU芯片產品通過國家密碼管理局商用密碼檢測中心安全性審查,符合安全芯片密碼檢測準則第二級的要求(簡稱“國密二級”),獲得由國家密碼管理局商用密碼檢測中心頒發的《商用密碼產品認證證書》。
    的頭像 發表于 04-11 14:40 ?1609次閱讀
    華潤微電子LX100安全MCU芯片產品榮獲商用密碼產品<b class='flag-5'>二級</b>認證

    C語言的指針用法

    C語言編程中善用指針可以簡化一些任務的處理,而對于一些任務(比如動態內存分配),必須要有指針才行的。也就是說精通C指針編程是很有必要的,幫助
    發表于 03-05 14:22 ?391次閱讀
    <b class='flag-5'>C</b>語言的<b class='flag-5'>指針</b>用法

    OLED設備公司DMS最近對二級分包商A公司提起訴訟

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

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

    作為一名關注通信接口和電子元器件的專業人士,你一定對ESD(Electrostatic Discharge)極管非常感興趣。讓我們一起來了解一下ESD極管是什么,以及如何選擇合適電容值的ESD二級管吧。
    的頭像 發表于 02-21 17:06 ?2805次閱讀
    ESD<b class='flag-5'>二</b>極管是什么?如何選擇合適電容值的ESD<b class='flag-5'>二級</b>管?
    太阳城百家乐官网试玩优惠 | 百家乐网络赌场| 百家乐官网高手看百家乐官网| 大发888官方备用| 百家乐游戏试玩免费| 百家乐官网神仙道官网| 大发888娱乐城大奖| 必博百家乐游戏| 百家乐官网赌场分析网| 梁山县| 大发888怎么| 网上百家乐的玩法技巧和规则| 财富百家乐官网的玩法技巧和规则| 金赞百家乐官网现金网| tt娱乐城clega| 百家乐游戏网上投注| 属鸡和属猪做生意好吗| 真人百家乐官网大转轮| 百家乐官网登封代理| 波音现金网| 大发888娱乐游戏账号| 百家乐庄闲比| 百家乐赢赌场百家乐| 百家乐官网下注法| 真人百家乐官网视频赌博| 百家乐官网走势图研究| 足球投注网址| 波音现金网| 鸿运国际娱乐城| 顶级赌场手机版| 大发888娱乐城技巧| 澳门百家乐赌场| 网络百家乐证据| 百家乐三跳| 太阳城百家乐下载网址| 百家乐不倒翁缺点| 百家乐庄闲必赢| 百家乐大眼仔用法| 阳宅风水24向详解| 百家乐图表分析| 百家乐投注方法多不多|