首先來複習一下指標與陣列
陣列:存放相同型別資料的集合
和陣列類似的還有結構體,結構體是存放不同型別資料的集合
需要注意的是:雖然指標和陣列在這裡被拿來一起比較,但它們是兩種型別,沒有關係。只是有相同或相似的特性。
看一下下面的**及其執行結果:
printf("%d\n", strlen(*p)); //報錯,型別不同
strlen是函式,*p以\0為結束標誌
陣列名代表整個陣列時只有兩種情況:
sizeof(陣列名),這裡的陣列名代表整個陣列
&陣列名,這裡的也是
指標陣列
指標陣列的本質是陣列,是存放指標的陣列
形式是int *arr[10];
陣列指標
指標分為整形指標和浮點型指標
整形指標:
int *pint;能夠指向整形資料的指標
浮點型指標:
float *pfn;能夠指向浮點型資料的指標
以int (*p)[10]為例
在這之中,p是指向陣列[10]的指標,是陣列指標
(*p)是指標,指向乙個大小為10的整形陣列
[ ]的優先順序大於*,所以要給*p加上()以保證 * 先和p結合。
假如是二維陣列的,如 int a[3][10]
則3(第乙個)可省略,但是10(第二個)不可省略
分析以下**:
arr表示陣列首元素的位址
&arr表示陣列的位址
是因為陣列的位址和陣列首元素的位址值是相同的,但是意義不同,所以arr和&arr位址值相同,但是arr+1和&arr+1位址值不同
那麼陣列的位址應該如何儲存呢?
結果顯示,雖然兩種方法列印的位址是一樣的,但是第一種方式會有警告,顯然p2是比較合適的選擇。
p2是數組織在,所以存放陣列的位址是合適的。
二維陣列傳參
由上圖可知,int (*parr2)[10]; 中parr並未初始化
指標和陣列的定義和宣告
從乙個例子來分辨定義和宣告
//陣列的定義
char arr = "abcdef";
//指標的定義
char* p = "abcdef";
extern char arr;
extern char* p;
int main()
在main.c中的extern表示arr和p是外部檔案定義的變數,在使用時去其他模組查詢。也可以理解為宣告了乙個外部的變數。通過結果我們可以分析到:
宣告的其實就是定義的變數本身。
函式指標
首先看一段**:
輸出的兩個位址,這兩個位址是test函式的位址。
那怎麼儲存呢?
再來看一段**:
void test()
void (*pfun1)();
void *pfun2();
int main()
在上述**中,能夠儲存位址的指標是pfun1,pfun1先和* 結合,說明pfun1是指標,指標指向的是乙個函式,指向的函式無引數,返回值型別為void。
函式指標陣列
陣列是乙個存放相同型別資料的儲存空間
在上述論述中,已經了解了指標陣列,比如:
int *arr[10]; //陣列的每個元素是int*
要把函式的位址存到乙個陣列中,這個陣列就叫函式指標陣列
int (*parr1[10])(); parr1 先和[ ]結合,說明parr1 是陣列,陣列的內容是 int (*)()型別的函式指標
用途:轉移表
例子:(計算器)
#include
#include
int add(int a, int b)
int sub(int a, int b)
int mul(int a, int b)
int mydiv(int a, int b)
int main()
printf("ret=%d\n", ret);
}getchar();
return 0;
}使用函式指標陣列實現:
#include
#include
int add(int a, int b)
int sub(int a, int b)
int mul(int a, int b)
int mydiv(int a, int b)
int main()
;//轉移表
while (input)
else
printf("輸入有誤\n");
printf("ret=%d\n", ret);
}getchar();
return 0;
}指向函式指標陣列的指標
指向函式指標陣列的指標是乙個指標
指標指向乙個陣列,陣列的元素都是函式指標;
void test(const char* str)
int main()
指標的指標位址運用
以下 輸出什麼 1 2 3 4 5 6 main int p int a 1 printf d p 1 正確答案 c 1 2 5 出現錯誤 選擇c,a表示乙個指向大小為5陣列的指標,那麼 a 1就是表示乙個指向大小為5的下乙個陣列的指標,也就是陣列a最後乙個元素的下乙個位置,那麼int p int ...
Git運用高階
git建立本地分支 git checkout b x 或git branch x git checkout x git從倉庫轉殖 轉殖專案 git clone git ip 專案.git 轉殖專案並在本地建立開發分支 git clone git ip 專案.git b develop git更新本地...
C 指標運用
前提 計算機裡,記憶體調取變數,需要知道變數的實體地址,相當於現實生活中的地標,當鎖定地標之後,程序從記憶體呼叫變數時才能做到精確無誤。而我們指標就提供了地標值,哲學上通俗的說,在一定時間內地標值精確的代表了一棟房子,我們可以說當我們說起地標值,就相當於說起了房子,當我們說起了房子,也就是地標值。指...