1. 程式人生 > >嵌入式C語言之C語言的高階表達與指標的高階應用

嵌入式C語言之C語言的高階表達與指標的高階應用

指標陣列與陣列指標、函式指標: 
        
        指標陣列  int *p[5]   相當於int *(p[5])  (陣列內的每個變數為指標變數)
                     首先是一個數組,其次陣列內的元素都是指標型別。
        指標陣列的實質是陣列,這個陣列記憶體放的元素是指標型別的。
        
        陣列指標 int (*p)[5]   首先是一個指標,其次指標指向一個數組,陣列內的元素為int型別
        陣列指標的實質是指標,這個指標指向對應的陣列。
        
        注:*的優先順序小於[];
        
        函式指標:本質還是指標變數,只是指標指向的是一個函式。函式的實質是一段程式碼,這段程式碼的地址在記憶體                      之中是連續分佈的。所以對於函式來說,最重要的時函式第一句程式碼的首地址,這個地址就是此函式的地址。
       (相當於陣列,只要知道陣列的首元素的首地就可以知道每個元素的地址)
        函式名做右值時,加不加&效果和意義是一樣的,凡是陣列做右值時不同。


int*[]         指標陣列:1.是一個數組2.陣列的內容是指標3.大小由[]內的內容決定4.指標指向的記憶體大小由int決定

int (*)[]  陣列指標:1.是一個指標2.指標指向的是一個數組3.陣列的內容是int型4.陣列的大小由[ ]內內容決定

int(*)()函式指標:1.是一個指標2.指向的是一個函式3.函式的返回值是int型(函式沒有型別,只有函式返回值有型別)4 .                                     函式指標指向的記憶體大小由函式決定

int(*[])()函式指標陣列:1.是一個數組2.陣列內放的是函式指標3.陣列的大小由[ ]的內容決定3.指標指向的是函式(函式名不加                                        ()代表函式地址,函式名加()代表函式呼叫

int*[]  、int (*)[]、int(*)()、int(*[])()都屬於資料的型別,只是將此種資料型別的變數名提至前面。而不是放在了最後。(前四種相當於int a[]的資料型別為int [],而變數名a提至前面)


結構體內嵌函式指標實現分層:
    複雜程式的編寫必須分工,分工的前提是分層。(示例:簡單的計算器的實現。上層程式實現程式框架,下層實現計算器具體的程式。實際上上層程式呼叫下層程式)
    下層程式碼核心是結構體變數:1.定義結構體變數 2.填充結構體變數 3.呼叫上層寫好的介面函式,把結構體變數傳給他即可。
    上層程式碼:注重業務邏輯,注重要實現的功能,與我們最終的目標相關聯。
    
->的使用:通過結構體指標變數直接獲得結構體變數的成員變數。
          一般的形式:結構體指標變數->成員變數。
          例如:struct stu 
          {
             int a;
             int b;
             pFunc =p;(假設pFunc為一個指標函式的函式名)
          }
          
          void jisuan(struct stu *stu1)
          {
                stu1->p(stu1->a,stu1->b);  此時就獲得了結構體內的成員變數。
          }
    

typedef :
        typedef 定義的是型別而不是變數(型別是一個數據模板,變數是一個實在的資料,且型別不佔記憶體)
        在面向物件中,型別就是類class,變數就是物件。
        
        typedef +原有的資料型別+新定義的資料型別;
        define +新定義的資料型別+原有的資料型別
        定義完在}後面必須加;分號。

二重指標:char *型別的變數可以通過再次取地址&得到二重指標char **型別;
          1.二重指標多用來指向指標陣列。
        例:  
    int *p1[5];
    int *p2;
    int **p3;
    
    p3=p1;  //p1是指標陣列名,本質是陣列名,做右值表示陣列的首元素首地址
         2.在實際程式設計中,多用於函式傳參時為了通過函式內部改變外部的一個指標變數。
         
二維陣列的指標引用:a[i][j]=*(*(p+i)+j);          
                     (此時的*(p+i)其實是一個*(p+i)的地址)
                二維陣列的陣列名錶示二維陣列的第一維陣列的首元素的首地址