<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 功能強大 支持多語言、二開方便! 廣告
                ## **1.類型轉換** 所謂通用類型指針,其實就是void \*;該指針可以用來轉換不同類型參數指針變量,如下例子(main\_3.c),我們定義一個用于輸出任意類型變量內容的函數,函數要求傳入參數時指定該參數的類型(比如uint16\_t,string等)來指示輸出: ![](https://img.kancloud.cn/cf/d0/cfd0258fcf36bff5171ee1a0f688de0e_832x480.png =600x) ### 函數將void \*類型格式化為想要類型的指針,然后取值輸出,調用方式: ![](https://img.kancloud.cn/7d/3d/7d3deb7dbbdf2759b68273f63c216fc6_618x500.png =600x) ### 編譯輸出: ![](https://img.kancloud.cn/15/9e/159e6209a7389eec4b0c2e0081d5705a_832x298.png =600x) ## **2.代理傳參調用** 下面這個例子會比較抽象(涉及到指針和地址比較抽象的轉換關系,了解即可,不要求能理解里面的轉換邏輯),源碼放在main\_4.c中,需要很好理解地址和指針變量的關系,我們借助void \*的列表來存儲一段空間,并用來做回調函數的調用,從而達到代理調用的過程。 ### 思考一下:int \*pa = (int *)malloc(sizeof(int)); 這個代碼中,指針變量本身的地址在哪,指針變量指向的地址在哪,指針變量指向的地址里面的內容是什么,先清這幾個概念再繼續往下看,首先指針變量本身的地址是&pa;指針指向的地址是pa(準確來說是(uint64\_t)pa);指針指向的地址里面的內容是*pa。 ### 聲明幾個函數如下: ![](https://img.kancloud.cn/cd/91/cd91188cbf6900be4207177dfcf9b5dd_832x94.png =600x) ### 然后有一定測試代碼如下: ![](https://img.kancloud.cn/90/75/9075a7b21a049ce3a66e57cca6b59623_832x648.png =600x) ### 首先我們申請了2個參數(args),然后給兩個參數進行賦值,第一個值是一個函數的地址,第二個值是一個uint16\_t類型的數值(12345);然后調用tester進行測試,函數tester里面把args的內容(函數和數值)取出來,進行調用,也就是把第一值強制轉換成函數指針(第21行),然后傳入數值完成調用。 再看args這幾個聲明的函數實現: ![](https://img.kancloud.cn/e3/a7/e3a7adcf19de6c97c0049a86aebbc251_832x684.png =600x) ### 在函數args\_add\_func里面,首先我們把指針變量func所指向的地址保存了起來(loader),然后loader被放在args中,由于index是0,因此是放在第一個位置;在函數args\_add\_uint16里面,我們則是把變量value的數值保存起來(pvalue),然后放在args第二個位置(index是1)。再回過頭看tester里面的代碼大概就能看懂了。 ### 編譯運行,結果等價于直接調用show函數:show(12345): ![](https://img.kancloud.cn/93/a7/93a7def518e8e0126cd4e678d61713ef_832x200.png =600x)
                  <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>

                              哎呀哎呀视频在线观看