<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                【75.1 指針的名義。】 剛開始接觸指針往往有這種感覺,指針的江湖很亂,什么“亂七八糟”的指針都能冒出來,空指針,指針的指針,函數的指針,各種名目繁多的指針,似乎都可以打著指針的名義讓你招架不住,而隨著我們功力的提升,會逐漸撥開云霧,發現指針的真諦不外乎三個,第一個是所有的指針所占用字節數都一樣,第二個是所有指針的操作本質都是“取地址”,第三個是所有各種不同類型的指針之間的轉換都可以用“小括號的類型強制轉換”。 【75.2 一維指針操作二維數組。】 C語言講究門當戶對,講究類型匹配,什么類型的指針就操作什么類型的數據,否則C編譯器在翻譯代碼的時候,會給予報錯或者警告。如果想甩開因類型不匹配而導致的報錯或者警告,就只能使用“小括號的類型強制轉換”,這個方法在項目中應用很頻繁,也很實用。一維指針想直接操作二維數組也是必須使用“小括號的類型強制轉換”。實際項目中為什么會涉及“一維指針想直接操作二維數組”?二維數組更加像一個由行與列組合而成的表格,而且每行單元的內存地址是連續的,并且上下每行與每行之間的首尾單元的內存地址也是連續的,凡是內存地址連續的都是指針的菜。我曾遇到這樣一種情況,要從一個二維表格里提取某一行數據用來顯示,而這個顯示函數是別人封裝好的一個庫函數,庫函數對外的接口是一維指針,這樣,如何把二維表格(二維數組)跟一維指針在接口上兼容起來,就是一個要面臨的問題,這時有兩種思路,一種是把二維數組的某一行數據先用原始的辦法提取出來存放在一個中間變量的一維數組,然后再把這個一維數組代入到一維指針接口的庫函數里,另一種思路是繞開中間變量,直接把二維數組的某一行的地址強制轉換成一維指針的類型,利用“類型強制轉換”繞開C編譯器的報錯或警告,實現二維數組跟一維指針“直通”,經過實驗,這種方法果然可以,從此對指針的感悟就又上了一層,原來,指針的“取地址”是不僅僅局限于某個數組的首地址,它完全可以利用類型強制轉換的小括號“()”與取地址符號“&”結合起來,讓指針跟一維數組或者二維數組里面任何一個單元直接關聯起來。請看下面兩個例子,用一維指針提取二維數組里面某一行的數據,第一個例子是在程序處理中的類型強制轉換的應用,第二個例子是在函數接口中的類型強制轉換的應用。 【75.3 在程序處理中的類型轉換。】 unsigned char table\[\]\[3\]= //二維數組 { {0x00,0x01,0x02}, //二維數組的第0行數據 {0x10,0x11,0x12}, //二維數組的第1行數據 {0x20,0x21,0x22}, //二維數組的第2行數據 }; unsigned char \*pGu8; //一維指針 unsigned char Gu8Buffer\[3\]; //一維數組,存放從二維數組里提取出來的某一行數據 unsigned char i; // for循環的變量 void main() { pGu8=(unsigned char \*)&table\[2\]\[0\]; //利用類型強制轉換使得一維指針跟二維數組關聯起來。 for(i=0;i<3;i++) { Gu8Buffer\[i\]=pGu8\[i\]; //提取二維數組的第2行數據,存入到一個一維數組里。 } while(1) { } } 【75.4 在函數接口中的類型轉換。】 在函數接口中,也可以利用類型強制轉換來實現函數接口的匹配問題,比如,下面這個寫法也是合法的。 void GetRowData(unsigned char \*pu8); //函數的聲明 unsigned char table\[\]\[3\]= //二維數組 { {0x00,0x01,0x02}, //二維數組的第0行數據 {0x10,0x11,0x12}, //二維數組的第1行數據 {0x20,0x21,0x22}, //二維數組的第2行數據 }; unsigned char Gu8Buffer\[3\]; //一維數組,存放從二維數組里提取出來的某一行數據 void GetRowData(unsigned char \*pu8) //一維指針的函數接口 { unsigned char i; // for循環的變量 for(i=0;i<3;i++) { Gu8Buffer\[i\]=pu8\[i\]; //提取二維數組的某行數據,存入到一個一維數組里。 } } void main() { GetRowData((unsigned char \*)&table\[2\]\[0\]); //利用類型強制轉換來兼容一維指針的函數接口 while(1) { } } 【75.5 注意指針或者數組越界的問題。】 上述例子中,二維數組內部只有9個數據,如果指針操作的數據超過了這9個數據的地址范圍,就會導致系統其它無辜的數據受到破壞,這個問題導致的后果是很嚴重的,這類指針或者數組越界的問題,大家平時做項目時必須留心注意。 【75.6 例程練習和分析。】 現在編寫一個練習程序。 /\*---C語言學習區域的開始。-----------------------------------------------\*/ void GetRowData(unsigned char \*pu8); //函數的聲明 unsigned char table\[\]\[3\]= //二維數組 { {0x00,0x01,0x02}, //二維數組的第0行數據 {0x10,0x11,0x12}, //二維數組的第1行數據 {0x20,0x21,0x22}, //二維數組的第2行數據 }; unsigned char Gu8Buffer\[3\]; //一維數組,存放從二維數組里提取出來的某一行數據 void GetRowData(unsigned char \*pu8) //一維指針的函數接口 { unsigned char i; // for循環的變量 for(i=0;i<3;i++) { Gu8Buffer\[i\]=pu8\[i\]; //提取二維數組的某行數據,存入到一個一維數組里。 } } void main() //主函數 { GetRowData((unsigned char \*)&table\[2\]\[0\]); //利用類型強制轉換來兼容一維指針的函數接口 View(Gu8Buffer\[0\]); //在電腦端觀察存放二維數組某行數據的一維數組的內容 View(Gu8Buffer\[1\]); //在電腦端觀察存放二維數組某行數據的一維數組的內容 View(Gu8Buffer\[2\]); //在電腦端觀察存放二維數組某行數據的一維數組的內容 while(1) { } } /\*---C語言學習區域的結束。-----------------------------------------------\*/ 在電腦串口助手軟件上觀察到的程序執行現象如下: 開始... 第1個數 十進制:32 十六進制:20 二進制:100000 第2個數 十進制:33 十六進制:21 二進制:100001 第3個數 十進制:34 十六進制:22 二進制:100010 分析: Gu8Buffer\[0\]是十六進制的0x20,提取了二維數組第2行中的某數據。 Gu8Buffer\[1\]是十六進制的0x21,提取了二維數組第2行中的某數據。 Gu8Buffer\[2\]是十六進制的0x22,提取了二維數組第2行中的某數據。 【75.7 如何在單片機上練習本章節C語言程序?】 直接復制前面章節中第十一節的模板程序,練習代碼時只需要更改“C語言學習區域”的代碼就可以了,其它部分的代碼不要動。編譯后,把程序下載進帶串口的51學習板,通過電腦端的串口助手軟件就可以觀察到不同的變量數值,詳細方法請看第十一節內容。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看