亚洲精品久久久久久久久久久,亚洲国产精品一区二区制服,亚洲精品午夜精品,国产成人精品综合在线观看,最近2019中文字幕一页二页

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

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

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

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}

運行結果:

現(xiàn)象描述:

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

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

2、二級指針的使用

1

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

2

一級指針 指針其實廣義的講它也是一種數(shù)據(jù)類型,所以所謂的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既然是變量,變量存于內(nèi)存中,那么就一定有其地址,如上圖所示ptr位于0x28FEE8地址處,其中其ptr里面保存的就是藍色區(qū)域中的地址,也就是a變量所在的地址,所以&a與ptr是相等的。

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

3

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

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**,變量肯定有內(nèi)存,其地址就是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,不太理解的小伙伴總是覺得,我已經(jīng)強制類型轉化為二級指針了,前面只需要用**獲得最后的值即可,怎么就不行呢? 我知道這里有問題我就是不理解為什么?

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

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

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

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

4、最后小結

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

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

    關注

    23

    文章

    4750

    瀏覽量

    97009
  • 矩陣
    +關注

    關注

    1

    文章

    441

    瀏覽量

    35754
  • 嵌入式程序
    +關注

    關注

    0

    文章

    6

    瀏覽量

    6694

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    二級差分電路的電阻怎么配置?

    想問下,二級差分電路的電阻該怎么配置呢?
    發(fā)表于 10-16 15:05

    配電柜二級浪涌保護器的安裝選型與行業(yè)應用方案

    IEC 61643-11及我國GB/T 18802.1-2011標準,SPD分為: Ⅰ(B):用于建筑物總配電柜,防直擊雷及大能量沖擊; ⅡC
    的頭像 發(fā)表于 09-28 14:40 ?241次閱讀
    配電柜<b class='flag-5'>二級</b>浪涌保護器的安裝選型與行業(yè)應用方案

    德州儀器模擬設計|使用第二級濾波器來減少電壓紋波

    在上期中,我們探討了高速 ADC 模擬輸入前端的各種無源匹配技巧。 ? 本期,為大家?guī)淼氖恰妒褂玫?b class='flag-5'>二級濾波器來減少電壓紋波》,將對比三種控制架構在相同輸出電壓紋波下的表現(xiàn),并提供了使用相同電氣規(guī)格
    的頭像 發(fā)表于 09-08 09:23 ?1313次閱讀
    德州儀器模擬設計|使用第<b class='flag-5'>二級</b>濾波器來減少電壓紋波

    嵌入式從入門到進階,怎么學?

    嵌入式從入門到進階,怎么學? 嵌入式學習的核心是 “軟硬結合的技術壁壘”,科學分層才能高效突破。以下是從入門到高階的精簡路線,幫你避開彎路: 1、基礎奠基層:構建技術底座 C 語言聚焦 指針、結構體
    發(fā)表于 09-02 09:44

    HarmonyOS NEXT應用元服務常見列表操作二級聯(lián)動

    二級聯(lián)動場景 場景描述 通過左邊一列表的選擇,聯(lián)動更新右邊二級列表的數(shù)據(jù),常用于商品分類選擇、編輯風格等二級類別選擇頁面。 本場景以商品分類列表頁面為例,分別通過List組件,對左側
    發(fā)表于 07-02 10:29

    二級浪涌電路之保險絲選型

    點在哪里呢? 本文通過DC110V接口保護電路的設計,講解二級防雷電路中退耦電感的選型。 、設計方案 防護器件的選擇相對來講比較直觀,器件廠家會提供器件的額定工作電壓、擊穿電壓、嵌位電壓等參數(shù),甚至
    發(fā)表于 06-28 22:00

    由 Mybatis 源碼暢談軟件設計(八):從根上理解 Mybatis 二級緩存

    1. 驗證二級緩存 在上一篇帖子中的 User 和 Department 實體類依然要用,這里就不再贅述了,要啟用二級緩存,需要在 Mapper.xml 文件中指定 cache 標簽,如下
    的頭像 發(fā)表于 06-23 11:35 ?286次閱讀
    由 Mybatis 源碼暢談軟件設計(八):從根上理解 Mybatis <b class='flag-5'>二級</b>緩存

    瀾起科技M88STAR5芯片喜獲國密二級安全認證

    近日,瀾起科技自主研發(fā)的數(shù)據(jù)保護與可信計算加速芯片M88STAR5成功通過GM/T 0008《安全芯片密碼檢測準則》第二級要求 ,榮獲商用密碼檢測認證中心頒發(fā)的 《商用密碼產(chǎn)品認證證書》 。這一
    的頭像 發(fā)表于 06-23 09:31 ?6433次閱讀

    蔡司培訓|提升技能必看——AUKOM 一/二級課程培訓

    AUKOM 一課程通過系統(tǒng)的分析測量誤差,即工件、環(huán)境、測量機、操作人員、測量策略,五個方面分析誤差因子,保證策量結果的準確性。 AUKOM 二級課程是在AUKOM 一的基礎上,更深入的展開
    發(fā)表于 06-03 14:26 ?1585次閱讀
    蔡司培訓|提升技能必看——AUKOM 一<b class='flag-5'>級</b>/<b class='flag-5'>二級</b>課程培訓

    二級浪涌電路之退耦電感選型

    二級浪涌防雷電路設計
    的頭像 發(fā)表于 05-12 15:31 ?1418次閱讀
    <b class='flag-5'>二級</b>浪涌電路之退耦電感選型

    指針被釋放后就變成了空指針

    指針被釋放后,是不是就變成了空指針?有好多同學提出了這樣的問題。 借用《C專家編程》上面的一段代碼,可以很好的解釋這個問題。 ? ? #include int main(){ char *s
    的頭像 發(fā)表于 01-22 09:23 ?595次閱讀

    C語言程序設計教程第4版第8講:指針

    C語言指針講解
    發(fā)表于 11-20 14:10 ?6次下載

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

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

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

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

    LMK04826如果設置第一pll掉電,第二級pll的輸入還必須是外部的vcxo來產(chǎn)生,不能用clkin0/1嗎?

    LMK04826: 如果設置第一pll掉電,第二級pll的輸入還必須是外部的vcxo來產(chǎn)生,不能用clkin0/1嗎?如果是的話,外部的時鐘源可以直
    發(fā)表于 11-08 07:03