<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                【76.1 二維數組指針的用途。】 前面章節講了一維指針操作二維數組,本質是通過“類型強制轉換”實現的,這種應用局限于某些特定的場合,畢竟一維有1個下標,二維有2個下標,一維和二維在隊形感上是有明顯差別的,強行用一維指針操作二維數組會破壞了代碼原有的隊形感,大多數的情況,還是用二維指針操作二維數組。 二維指針主要應用在兩個方面,一方面是N個二維數組的“中轉站”應用,另一方面是函數接口的應用。比如,當某項目有N個二維數組表格時,要通過某個變量來切換處理某個特定的表格,以便實現“N選一”的功能,此時,二維指針在這N個二維數組之間就起到中轉站的作用。又,當某個函數接口想輸入或者輸出一個二維數組時,就必然要用到二維指針作為函數的接口參數。 【76.2 二維指針的“中轉站”應用。】 舉一個例子,有3個現有的二維數組,通過某個變量來選擇切換,把某個二維數組的數據復制到指定的一個緩存數組中。 code unsigned char table\_1\[3\]\[3\]= //第1個現有的二維數組 { {0x00,0x01,0x02}, {0x10,0x11,0x12}, {0x20,0x21,0x22}, }; code unsigned char table\_2\[3\]\[3\]= //第2個現有的二維數組 { {0xA0,0xA1,0xA2}, {0xB0,0xB1,0xB2}, {0xC0,0xC1,0xC2}, }; code unsigned char table\_3\[3\]\[3\]= //第3個現有的二維數組 { {0xD0,0xD1,0xD2}, {0xE0,0xE1,0xE2}, {0xF0,0xF1,0xF2}, }; unsigned char SaveBuffer\[3\]\[3\]; //指定的一個緩存數組 unsigned char TableSec; //選擇變量 const unsigned char (\*pTable)\[3\]; //“中轉站”的二維指針 unsigned char R,L; //復制數據時用到的for循環變量 void main() { TableSec=2; //選擇第2個現有的二維數組 switch(TableSec) //根據選擇變量來切換選擇某個現有的二維數組 { case 1: //選擇第1個現有二維數組 pTable=table\_1; //二維指針pTable在這里關聯指定的數組,起到中轉站的作用。 break; case 2: //選擇第2個現有二維數組 pTable=table\_2; //二維指針pTable在這里關聯指定的數組,起到中轉站的作用。 break; case 3: //選擇第3個現有二維數組 pTable=table\_2; //二維指針pTable在這里關聯指定的數組,起到中轉站的作用。 break; } //通過二維指針pTable來復制數據到指定的緩存數組SaveBuffer for(R=0;R<3;R++) //行循環 { for(L=0;L<3;L++) //列循環 { SaveBuffer\[R\]\[L\]=pTable\[R\]\[L\]; //這里能看到,二維指針維護了二維數組的隊形感 } } while(1) { } } 【76.3 二維指針在“函數接口”中的應用。】 把上述例子“復制過程”的代碼封裝成一個函數,實現的功能還是一樣,有3個現有的二維數組,通過某個變量來選擇切換,把某個二維數組的數據復制到指定的一個緩存數組中。 //函數聲明 void CopyBuffer(const unsigned char (\*pTable)\[3\],unsigned char (\*pSaveBuffer)\[3\]); code unsigned char table\_1\[3\]\[3\]= //第1個現有的二維數組 { {0x00,0x01,0x02}, {0x10,0x11,0x12}, {0x20,0x21,0x22}, }; code unsigned char table\_2\[3\]\[3\]= //第2個現有的二維數組 { {0xA0,0xA1,0xA2}, {0xB0,0xB1,0xB2}, {0xC0,0xC1,0xC2}, }; code unsigned char table\_3\[3\]\[3\]= //第3個現有的二維數組 { {0xD0,0xD1,0xD2}, {0xE0,0xE1,0xE2}, {0xF0,0xF1,0xF2}, }; unsigned char SaveBuffer\[3\]\[3\]; //指定的一個緩存數組 unsigned char TableSec; //選擇變量 //\*pTable是輸入接口帶const修飾,\*pSaveBuffer是輸出結果的接口無const。 void CopyBuffer(const unsigned char (\*pTable)\[3\],unsigned char (\*pSaveBuffer)\[3\]) { unsigned char R,L; //復制數據時用到的for循環變量 for(R=0;R<3;R++) //行循環 { for(L=0;L<3;L++) //列循環 { pSaveBuffer\[R\]\[L\]=pTable\[R\]\[L\]; //這里能看到,二維指針維護了二維數組的隊形感 } } } void main() { TableSec=2; //選擇第2個現有的二維數組 switch(TableSec) //根據選擇變量來切換選擇某個現有的二維數組 { case 1: //選擇第1個現有二維數組 CopyBuffer(table\_1,SaveBuffer); //二維指針在這里分別體現了輸入和輸出接口作用 break; case 2: //選擇第2個現有二維數組 CopyBuffer(table\_2,SaveBuffer); //二維指針在這里分別體現了輸入和輸出接口作用 break; case 3: //選擇第3個現有二維數組 CopyBuffer(table\_3,SaveBuffer); //二維指針在這里分別體現了輸入和輸出接口作用 break; } while(1) { } } 【76.4 二維指針“類型強制轉換”的書寫格式。】 unsigned char \*pu8,unsigned int \*pu16,unsigned int \*pu32這些指針的書寫定義都是很有規則感的,相比之下,二維指針的定義顯得缺乏規則感,比如定義的二維指針變量unsigned char (\*pTable)\[3\],不規則在哪?就在于二維指針的變量pTable嵌入到了括號中去,跟符號“\*”捆綁在一起,這時就會冒出一個問題,如果我要強制某個指針變量為二維指針怎么辦?下面的例子已經給出了答案。 unsigned char table\[3\]\[3\]= //二維數組 { {0xD0,0xD1,0xD2}, {0xE0,0xE1,0xE2}, {0xF0,0xF1,0xF2}, }; unsigned char (\*pTable)\[3\]; void main() { pTable=(unsigned char (\*)\[3\])table; //這里,強制類型轉換用unsigned char (\*)\[3\] } 總結:二維數組的強制類型轉換用這種書寫格式(unsigned char (\*)\[N\]),這里的N是代表實際項目中某數組的“列”數。 【76.5 例程練習和分析。】 現在編寫一個練習程序。 /\*---C語言學習區域的開始。-----------------------------------------------\*/ void CopyBuffer(const unsigned char (\*pTable)\[3\],unsigned char (\*pSaveBuffer)\[3\]); code unsigned char table\_1\[3\]\[3\]= //第1個現有的二維數組 { {0x00,0x01,0x02}, {0x10,0x11,0x12}, {0x20,0x21,0x22}, }; code unsigned char table\_2\[3\]\[3\]= //第2個現有的二維數組 { {0xA0,0xA1,0xA2}, {0xB0,0xB1,0xB2}, {0xC0,0xC1,0xC2}, }; code unsigned char table\_3\[3\]\[3\]= //第3個現有的二維數組 { {0xD0,0xD1,0xD2}, {0xE0,0xE1,0xE2}, {0xF0,0xF1,0xF2}, }; unsigned char SaveBuffer\[3\]\[3\]; //指定的一個緩存數組 unsigned char TableSec; //選擇變量 //\*pTable是輸入接口帶const修飾,\*pSaveBuffer是輸出結果的接口無const。 void CopyBuffer(const unsigned char (\*pTable)\[3\],unsigned char (\*pSaveBuffer)\[3\]) { unsigned char R,L; //復制數據時用到的for循環變量 for(R=0;R<3;R++) //行循環 { for(L=0;L<3;L++) //列循環 { pSaveBuffer\[R\]\[L\]=pTable\[R\]\[L\]; //這里能看到,二維指針維護了二維數組的隊形感 } } } void main() //主函數 { TableSec=2; //選擇第2個現有的二維數組 switch(TableSec) //根據選擇變量來切換選擇某個現有的二維數組 { case 1: //選擇第1個現有二維數組 CopyBuffer(table\_1,SaveBuffer); //二維指針在這里分別體現了輸入和輸出接口作用 break; case 2: //選擇第2個現有二維數組 CopyBuffer(table\_2,SaveBuffer); //二維指針在這里分別體現了輸入和輸出接口作用 break; case 3: //選擇第3個現有二維數組 CopyBuffer(table\_3,SaveBuffer); //二維指針在這里分別體現了輸入和輸出接口作用 break; } View(SaveBuffer\[0\]\[0\]); //在電腦端觀察某個二維數組第0行數據第0個元素的內容 View(SaveBuffer\[0\]\[1\]); //在電腦端觀察某個二維數組第0行數據第1個元素的內容 View(SaveBuffer\[0\]\[2\]); //在電腦端觀察某個二維數組第0行數據第2個元素的內容 while(1) { } } /\*---C語言學習區域的結束。-----------------------------------------------\*/ 在電腦串口助手軟件上觀察到的程序執行現象如下: 開始... 第1個數 十進制:160 十六進制:A0 二進制:10100000 第2個數 十進制:161 十六進制:A1 二進制:10100001 第3個數 十進制:162 十六進制:A2 二進制:10100010 分析: SaveBuffer\[0\]\[0\]是十六進制的0xA0,提取了第2個二維數組的第0行第0個數據。 SaveBuffer\[0\]\[1\]是十六進制的0xA1,提取了第2個二維數組的第0行第1個數據。 SaveBuffer\[0\]\[2\]是十六進制的0xA2,提取了第2個二維數組的第0行第2個數據。 【76.6 如何在單片機上練習本章節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>

                              哎呀哎呀视频在线观看