<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國際加速解決方案。 廣告
                ~~~ int *p1[6]; //指針數組 int *(p2[6]); //指針數組,和上面的形式等價 int (*p3)[6]; //二維數組指針 int (*p4)(int, int); //函數指針 ~~~ C語言標準規定,對于一個符號的定義,編譯器總是從它的名字開始讀取,然后按照優先級順序依次解析。對,從名字開始,不是從開頭也不是從末尾,這是理解復雜指針的關鍵! 對于初學者,有幾種運算符的優先級非常容易混淆,它們的優先級從高到低依次是: * 定義中被括號`( )`括起來的那部分。 * 后綴操作符:括號`( )`表示這是一個函數,方括號`[ ]`表示這是一個數組。 * 前綴操作符:星號`*`表示“指向xxx的指針”。 ### 1)?int \*p1\[6\]; 從 p1 開始理解,它的左邊是 \*,右邊是 \[ \],\[ \] 的優先級高于 \*,所以編譯器先解析`p1[6]`,p1 首先是一個擁有 6 個元素的數組,然后再解析`int *`,它用來說明數組元素的類型。從整體上講,p1 是一個擁有 6 個 int \* 元素的數組,也即指針數組。 ### 2)?int (\*p3)\[6\]; 從 p3 開始理解,( ) 的優先級最高,編譯器先解析`(*p3)`,p3 首先是一個指針,剩下的`int [6]`是 p3 指向的數據的類型,它是一個擁有 6 個元素的一維數組。從整體上講,p3 是一個指向擁有 6 個 int 元素數組的指針,也即二維數組指針。 > 為了能夠通過指針來遍歷數組元素,在定義數組指針時需要進行降維處理,例如三維數組指針實際指向的數據類型是二維數組,二維數組指針實際指向的數據類型是一維數組,一維數組指針實際指向的是一個基本類型;在表達式中,數組名也會進行同樣的轉換(下降一維)。 ### 3) int (\*p4)(int, int); 從 p4 開始理解,( ) 的優先級最高,編譯器先解析`(*p4)`,p4 首先是一個指針,它后邊的 ( ) 說明 p4 指向的是一個函數,括號中的`int, int`是參數列表,開頭的`int`用來說明函數的返回值類型。整體來看,p4 是一個指向原型為`int func(int, int);`的函數的指針。 ### 4) char \*(\* c\[10\])(int \*\*p); 這個定義有兩個名字,分別是 c 和 p,乍看起來 p 是指針變量的名字,不過很遺憾這是錯誤的。如果 p 是指針變量名,`c[10]`這種寫法就又定義了一個新的名字,這讓人匪夷所思。 以 c 作為變量的名字,先來看括號內部(綠色粗體): char \*?**(\* c\[10\])?**(int \*\*p); [\] 的優先級高于 \*,編譯器先解析`c[10]`,c 首先是一個數組,它前面的`*`表明每個數組元素都是一個指針,只是還不知道指向什么類型的數據。整體上來看,`(* c[10])`說明 c 是一個指針數組,只是指針指向的數據類型尚未確定。 跳出括號,根據優先級規則(() 的優先級高于 \*)應該先看右邊(紅色粗體): char \*?**(\* c\[10\])?(int \*\*p)**; `( )`說明是一個函數,`int **p`是函數參數。 再看左邊(橘黃色粗體): **char \***?**(\* c\[10\])?(int \*\*p)**; `char *`是函數的返回值類型。 從整體上看,我們可以將定義分成兩部分: **char \***?**(\* c\[10\])?(int \*\*p)**; 綠色粗體表明 c 是一個指針數組,紅色粗體表明指針指向的數據類型,合起來就是:c 是一個擁有 10 個元素的指針數組,每個指針指向一個原型為`char *func(int **p);`的函數。 ### 5) int (\*(\*(\*pfunc)(int \*))\[5\])(int \*); 從 pfunc 開始理解,先看括號內部(綠色粗體): int (\*(\***(\*pfunc)**(int \*))\[5\])(int \*); pfunc 是一個指針。 跳出括號,看它的兩邊(紅色粗體): int (\*(\***(\*pfunc)(int \*)**)\[5\])(int \*); 根據優先級規則應該先看右邊的`(int *)`,它表明這是一個函數,`int *`是參數列表。再看左邊的`*`,它表明函數的返回值是一個指針,只是指針指向的數據類型尚未確定。 將上面的兩部分合成一個整體,如下面的藍色粗體所示,它表明 pfunc 是一個指向函數的指針,現在函數的參數列表確定了,也知道返回值是一個指針了(只是不知道它指向什么類型的數據)。 int (\*?**(\*(\*pfunc)(int \*))**?\[5\])(int \*); 藍色粗體以外的部分,就用來說明函數返回什么類型的指針。 我們接著分析,再向外跳一層括號(紅色粗體): int (**\***?**(\*(\*pfunc)(int \*))**?**\[5\]**)(int \*); \[ \] 的優先級高于 \*,先看右邊,\[5\] 表示這是一個數組,再看左邊,\* 表示數組的每個元素都是指針。也就是說,\* \[5\] 是一個指針數組,函數返回的指針就指向這樣一個數組。 那么,指針數組中的指針又指向什么類型的數據呢?再向外跳一層括號(橘黃色粗體): **int****(\***?**(\*(\*pfunc)(int \*))**?**\[5\])****(int \*)**; 先看橘黃色部分的右邊,它是一個函數,再看左邊,它是函數的返回值類型。也就是說,指針數組中的指針指向原型為`int func(int *);`的函數。 將上面的三部分合起來就是:pfunc 是一個函數指針(藍色部分),該函數的返回值是一個指針,它指向一個指針數組(紅色部分),指針數組中的指針指向原型為`int func(int *);`的函數(橘黃色部分)。
                  <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>

                              哎呀哎呀视频在线观看