嵌入式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)的地址)
二維陣列的陣列名錶示二維陣列的第一維陣列的首元素的首地址