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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                【74.1 重溫“函數的接口參數”。】 函數的接口參數主要起到標識的作用。比如: 一個加法函數: unsigned char add(unsinged char a,unsigned char b) { return (a+b); } 這里的a和b就是接口參數,它的作用是告訴人們,你把兩個加數分別代入a和b,返回的就是你要的加法運算結果。這里的接口參數就起到入口標識的作用。注意,這句話的關鍵詞是“標識”而不是“入口”,因為函數的“入口”不是唯一的,而是無數條路徑。為什么這么說?我們把上面的例子改一下,改成全局變量,例子如下: 一個加法函數: unsinged char a; //加數 unsigned char b; //加數 unsigned char c; //和 void add(void) { c=a+b; } 上述例子中,盡管我用“兩個”void(空的)關鍵詞把原來加法函數的入口(接口參數)和出口(return返回)都堵得死死的,但是,全局變量是無法阻擋的,它進入一個函數的內部不受任何限制,也就是說,我們做項目的時候,如果把所有函數的接口參數和返回都改成void類型,所有的信息傳遞都改用全局變量,這樣也是可以勉強把項目做完成的。但是,如果真的把所有函數的接口參數都改成void,全部靠全局變量來傳遞信息,那么最大的問題是函數多了之后,閱讀非常不方面,你每看到一個被調用的函數,你不能馬上猜出它大概跟哪些全局變量發生了關聯,你必須一個一個的去查該函數的源代碼才能理清楚,針對這個問題,C語言的設計者,給了函數非常豐富的接口參數,最理想的函數是:你把凡是與此函數相關的全局變量都經過接口參數的入口才進入到函數內部,盡量把接口參數的入口看作是函數的唯一合法入口(盡管不是唯一也不是必須),這樣只要看函數的接口參數就知道這個函數跟哪些全局變量有關,函數的輸入輸出就非常清晰明了。但是問題又來了,如果有多少個全局變量就開多少個接口參數,接口參數就會變得非常多,接口參數多了,函數的門面就非常難看,無異于把本來應該“小而窄”的接口設在“寬而廣”的平原上,還不如直接用原來那種全局變量強行進入呢。那么,要解決這個問題怎么辦?本節的主角“結構體指針”可以解決這個問題。 【74.2 結構體指針在函數接口處的頻繁應用。】 當函數的接口參數非常多的時候,可以把N個相關的全局變量“打包”成一個結構體數據,碰到函數接口的時候,可以通過“結構體指針”以“包”為單位的方式進入,這樣就可以讓函數的接口參數看起來非常少,這種方法,是很多32位單片機的庫函數一直在用的方法,它最重要的好處是簡化入口的通道數量。你想想,32位單片機有那么多寄存器,如果沒有這種以“結構體指針”為接口參數的方式,它的入口可能需要幾十個接口參數,那豈不是非常麻煩?庫函數設計的成敗與否,本來就在于接口的設計合不合理,“結構體指針作為函數接口參數”在此場合就顯得特別有價值,使用了這種方法,函數與全局變量之間,它們的關聯脈絡再也不用隱藏起來,并且可以很清晰的表達清楚。現在舉一個例子,比如有一個函數,要實現把5個全局變量“自加1”的功能,分別使用兩種接口參數來實現,例子如下: 第一種方式:有多少個全局變量就開多少個接口參數。 //函數的聲明 void Add\_One( unsigned char \*pu8Data\_1, //第1個接口參數 unsigned char \*pu8Data\_2, //第2個接口參數 unsigned char \*pu8Data\_3, //第3個接口參數 unsigned char \*pu8Data\_4, //第4個接口參數 unsigned char \*pu8Data\_5); //第5個接口參數 //5個全局變量的定義 unsigned char a; unsigned char b; unsigned char c; unsigned char d; unsigned char e; //函數的定義 void Add\_One( unsigned char \*pu8Data\_1, //第1個接口參數 unsigned char \*pu8Data\_2, //第2個接口參數 unsigned char \*pu8Data\_3, //第3個接口參數 unsigned char \*pu8Data\_4, //第4個接口參數 unsigned char \*pu8Data\_5) //第5個接口參數 { \*pu8Data\_1=(\*pu8Data\_1)+1; //實現自加1的功能 \*pu8Data\_2=(\*pu8Data\_2)+1; \*pu8Data\_3=(\*pu8Data\_3)+1; \*pu8Data\_4=(\*pu8Data\_4)+1; \*pu8Data\_5=(\*pu8Data\_5)+1; } void main() { //5個全局變量都初始化為0 a=0; b=0; c=0; d=0; e=0; //函數的調用,實現5個變量都“自加1”的功能。加“&”表示“傳址”的方式進入函數內部。 Add\_One(&a, //第1個接口參數 &b, //第2個接口參數 &c, //第3個接口參數 &d, //第4個接口參數 &e); //第5個接口參數 } 第二種方式:把N個全局變量打包成一個結構體,以“結構體指針”的方式進入函數內部。 //函數的聲明 void Add\_One(struct StructMould \*ptMould); //只有1個結構體指針,大大減少了接口參數。 //結構體的“造模” struct StructMould { unsigned char a; unsigned char b; unsigned char c; unsigned char d; unsigned char e; }; struct StructMould GtMould; //生成一個結構體變量,內部包含了5個全局變量a,b,c,d,e。 //函數的定義 void Add\_One(struct StructMould \*ptMould) //只有1個結構體指針,大大減少了接口參數。 { ptMould->a=ptMould->a+1; //實現“自加1”的功能。 ptMould->b=ptMould->b+1; ptMould->c=ptMould->c+1; ptMould->d=ptMould->d+1; ptMould->e=ptMould->e+1; } void main() { //5個全局變量的結構體成員都初始化為0 GtMould.a=0; GtMould.b=0; GtMould.c=0; GtMould.d=0; GtMould.e=0; //函數的調用,實現5個變量都“自加1”的功能。加“&”表示“傳址”的方式進入函數內部。 Add\_One(&GtMould); //只有1個結構體指針,大大減少了接口參數。 } 【74.3 例程練習和分析。】 現在編寫一個“以結構體指針為函數接口參數”的練習程序。 /\*---C語言學習區域的開始。-----------------------------------------------\*/ //函數的聲明 void Add\_One(struct StructMould \*ptMould); //只有1個結構體指針,大大減少了接口參數。 //結構體的“造模” struct StructMould { unsigned char a; unsigned char b; unsigned char c; unsigned char d; unsigned char e; }; struct StructMould GtMould; //生成一個結構體變量,內部包含了5個全局變量a,b,c,d,e。 //函數的定義 void Add\_One(struct StructMould \*ptMould) //只有1個結構體指針,大大減少了接口參數。 { ptMould->a=ptMould->a+1; //實現“自加1”的功能。 ptMould->b=ptMould->b+1; ptMould->c=ptMould->c+1; ptMould->d=ptMould->d+1; ptMould->e=ptMould->e+1; } void main() //主函數 { //5個全局變量的結構體成員都初始化為0 GtMould.a=0; GtMould.b=0; GtMould.c=0; GtMould.d=0; GtMould.e=0; //函數的調用,實現5個變量都“自加1”的功能。加“&”表示“傳址”的方式進入函數內部。 Add\_One(&GtMould); //只有1個結構體指針,大大減少了接口參數。 View(GtMould.a); //在電腦端觀察結構體成員GtMould.a的數值。 View(GtMould.b); //在電腦端觀察結構體成員GtMould.b的數值。 View(GtMould.c); //在電腦端觀察結構體成員GtMould.c的數值。 View(GtMould.d); //在電腦端觀察結構體成員GtMould.d的數值。 View(GtMould.e); //在電腦端觀察結構體成員GtMould.e的數值。 while(1) { } } /\*---C語言學習區域的結束。-----------------------------------------------\*/ 在電腦串口助手軟件上觀察到的程序執行現象如下: 開始... 第1個數 十進制:1 十六進制:1 二進制:1 第2個數 十進制:1 十六進制:1 二進制:1 第3個數 十進制:1 十六進制:1 二進制:1 第4個數 十進制:1 十六進制:1 二進制:1 第5個數 十進制:1 十六進制:1 二進制:1 分析: 結構體成員GtMould.a的數值是1。 結構體成員GtMould.b的數值是1。 結構體成員GtMould.c的數值是1。 結構體成員GtMould.d的數值是1。 結構體成員GtMould.e的數值是1。 【74.4 如何在單片機上練習本章節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>

                              哎呀哎呀视频在线观看