www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 嵌入式微處理器
[導(dǎo)讀]1、先把問題擺出來 參考Demo: 1#include? 2#include? 3 4/************************************ 5?*?Fuction:?測(cè)試demo? 6?*?Author?:(公眾號(hào):最后一個(gè)bug)? 7?***********************************/ 8int?main(int?argc,?char?*argv[


1、先把問題擺出來


參考Demo:
 1#include <stdio.h>
2#include <stdlib.h>
3
4/************************************
5 * Fuction: 測(cè)試demo 
6 * Author :(公眾號(hào):最后一個(gè)bug) 
7 ***********************************/

8int main(int argc, char *argv[]) {
9    int a = 10;
10    int *ptr = &a;
11    int **ptrptr = &ptr;
12
13    printf("           *ptr = %d\n",*ptr);
14    printf("       **ptrptr = %d\n",**ptrptr);
15    printf("**((int **)ptr) = %d\n",**((int **)ptr));
16    printf("歡迎關(guān)注公眾號(hào):最后一個(gè)bug\n"); 
17    return 0;
18}
運(yùn)行結(jié)果:

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

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


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


1

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

2

一級(jí)指針
    指針其實(shí)廣義的講它也是一種數(shù)據(jù)類型,所以所謂的int* ptr;其中int* 就是變量ptr的類型,那么ptr就是我們常說的指針變量。
Demo:
 1#include <stdio.h>
2#include <stdlib.h>
3/************************************
4 * Fuction: 測(cè)試demo 
5 * Author :(公眾號(hào):最后一個(gè)bug) 
6 ***********************************/

7int main(int argc, char *argv[]) {
8    int a = 10;
9    int *ptr = &a;
10
11    printf(" a   = %d\n",a);
12    printf("&ptr = 0x%X\n",&ptr);
13    printf("&a   = 0x%X\n",&a);
14    printf("ptr  = 0x%X\n",ptr);
15    printf("*ptr = %d\n",*ptr);
16
17    printf("歡迎關(guān)注公眾號(hào):最后一個(gè)bug\n"); 
18    return 0;
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í)指針也就順理成章了,來看看下面的小程序:
Demo:
 1#include <stdio.h>
2#include <stdlib.h>
3/************************************
4 * Fuction: 測(cè)試demo 
5 * Author :(公眾號(hào):最后一個(gè)bug) 
6 ***********************************/

7int main(int argc, char *argv[]) {
8    int a = 10;
9    int *ptr = &a;
10    int **ptrptr = &ptr;
11
12    printf(" a      = %d\n",a);
13
14    printf("&ptrptr = 0x%X\n",&ptrptr);
15
16    printf("ptrptr  = 0x%X\n",ptrptr);
17    printf("&*ptrptr= 0x%X\n",&*ptrptr);
18    printf("&ptr    = 0x%X\n",&ptr);
19
20    printf("*ptrptr = 0x%X\n",*ptrptr);
21    printf("ptr     = 0x%X\n",ptr);
22
23    printf("*ptr    = %d\n",*ptr);
24    printf("**ptrptr= %d\n",**ptrptr);
25
26    printf("歡迎關(guān)注公眾號(hào):最后一個(gè)bug\n"); 
27    return 0;
28}
運(yùn)行結(jié)果:

圖解:

分析一下:
  • 通過上圖來看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變量的值,所以&*ptrptrptrptr。


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

參考Demo:
 1#include <stdio.h>
2#include <stdlib.h>
3
4/************************************
5 * Fuction: 測(cè)試demo 
6 * Author :(公眾號(hào):最后一個(gè)bug) 
7 ***********************************/

8int main(int argc, char *argv[]) {
9    int a = 10;
10    int *ptr = &a;
11    int **ptrptr = &ptr;
12
13    printf("           *ptr = %d\n",*ptr);
14    printf("       **ptrptr = %d\n",**ptrptr);
15    printf("**((int **)ptr) = %d\n",**((int **)ptr));
16    printf("歡迎關(guān)注公眾號(hào):最后一個(gè)bug\n"); 
17    return 0;
18}
分析一下:
  • 我們知道問題出在**(int**)ptr,不太理解的小伙伴總是覺得,我已經(jīng)強(qiáng)制類型轉(zhuǎn)化為二級(jí)指針了,前面只需要用**獲得最后的值即可,怎么就不行呢? 我知道這里有問題我就是不理解為什么?

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


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

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

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


4、最后小結(jié)


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

  


-END-


本文授權(quán)轉(zhuǎn)載自公眾號(hào)最后一個(gè)bug,作者:bug菌




推薦閱讀



【01】GitHub新功能:發(fā)起抗議「996」,一小時(shí)獲1000星
【02】為什么美國(guó)程序員工作比中國(guó)程序員工作輕松、加班少?
【03】在華為,加班究竟有多恐怖?
【04】按照這個(gè)代碼調(diào)試指南,別人加班你下班!
【05】京東強(qiáng)推 995 工作制,中國(guó)式變態(tài)加班何時(shí)休?


免責(zé)聲明:整理文章為傳播相關(guān)技術(shù),版權(quán)歸原作者所有,如有侵權(quán),請(qǐng)聯(lián)系刪除

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉