理解函式指標和定義 .理解函式指標陣列和定義,
陣列指標
概念:陣列指標是指標,只要是指標他就佔4個位元組;
例如: 整形指標:int *p;能夠指向整形資料的指標
浮點型指標:float *p;能夠指向浮點型的資料的指標
那麼陣列指標,同樣的理解就是指向陣列的指標。
Eg: int (*p)[10]
解釋:這裡的p由於小括號的原因和*先結合,所以他就是指標,然後指向的是一個大小為10的整形陣列,所以p首先是一個指標,然後指向一個整形陣列,即p的名字叫做陣列指標。
使用:
Int arr[10] = {0};
此時:arr表示:陣列首元素的地址
&arr 表示:陣列的地址
我們執行下面一段程式碼,得到結果如圖:
arr代表陣列的第一個元素,所以打印出陣列第一個元素的地址
arr+1代表陣列第一個元素向後加一個,得到了的第二個元素,因為是整形陣列,所以,地址加了一個4
&arr+1:因為&arr代表的是整個陣列的地址,所以在+1之後,代表的是下一個陣列的地址。
指標陣列
根據陣列指標是指標的理解,我們可以得到,指標陣列就是陣列,其陣列的元素都是指標。
Eg:一個以為指標陣列的定義:int *p[10];
因為[]的結合優先順序比較高,所以p先和[]結合
指標陣列常用來指向字串,方便字串的處理
陣列引數 和 指標引數
一維陣列的傳參:
沒有報錯,說明圖中的傳參方式都可以作為一維陣列的傳參方式
二維陣列的傳參:
當執行這段程式碼的時候,會出現第一個函式的報錯,提示缺少下標,當我們在一個函式的引數的第二個中加上二維陣列的列數:
一級指標傳參
當一個函式的引數部分是一級指標的 時候,那麼此時我們可以給引數傳進去一個地址,因為指標裡面就是地址,也可以傳進去一個指標,此時編譯都可以通過,所以,我們在一定的程度上就可以把:地址=指標
二級指標傳參
在執行如圖程式碼之後,test函式的引數就是接收一個二級指標,在呼叫的時候,第一次直接傳進去一個二級指標:呼叫成功。因為二級指標裡面存放的是一個一級指標的地址,所以我們在第二次呼叫的時候,傳進去一個一級指標的地址&p,顯示呼叫成功,所以:函式的引數是二級指標的時候,可以接收一個二級指標或者一級指標的地址作為引數。
函式指標
首先執行一段程式碼:
可以看到test 和&test的值是一樣的,所以此時,我們就可以把test看作是函式的地址,
閱讀一下程式碼幫助理解:
Void test(){
Printf(“hehe\n”);
}
//void (*p1)()
//void *p2()
此時只有p1可以存放函式test的地址,p1先和*結合,說明p1是指標,指標的指向是一個函式,指向的這個函式沒有引數,返回值的型別是void。
函式指標陣列:
首先它是一個數組,存放的元素是指標,這些指標都指向某個函式。
則其定義為:
例如:int (*parr1[10])()
首先parr1先和[]結合,他就是陣列,那麼陣列的內容就是int (*)()型別的函式指標
錯誤例項: int *parr1[10]()×
int (*)()parr3[10] ×
函式指標陣列的用途:轉移表
在我們設計一個計算器的時候:
我們用函式指標陣列,將加減乘除四個函式存放起來,
呼叫時,我們可以:*pcal[1](3,2),此時我們將呼叫add函式進行3和2 加運算
函式指標陣列的指標
既然陣列可以用指標指,叫做陣列指標,那麼函式指標陣列也可用指標指起來,叫做:函式指標陣列的指標,顧名思義,這個指標指向了一個數組,這個陣列叫做函式指標陣列,數組裡面的元素存放的是函式的指標,這些函式的指標,分別的指向了特定的函式。
如何定義:
Void test (const char *str){}
Int main(){
//定義函式指標pfun
Void (*pfun)(const char *) = test;
//函式指標的陣列pfunarr
Void (*pfunarr[5])(const char *str);
//函式指標陣列的指標
//void (*(*pfunarr[5]) )(const char *) = &pfunarr;
Return 0;
}
函式指標的應用:回撥函式
例如:
Int test(void *str1,void *str2){}
void fun(int x,const char* str,int(*funname)(void *,void*)){
//函式體內部會呼叫第三個引數傳進來的函式,返回值是int,有兩個引數,都是void型
}
Int main(){
Fun(a,str,test);//此時test函式就當做引數傳遞到fun函式裡面
Return 0
}