1. 程式人生 > >函式指標、函式指標陣列,函式指標陣列的指標

函式指標、函式指標陣列,函式指標陣列的指標

陣列指標

概念:陣列指標是指標,只要是指標他就佔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先和[]結合

指標陣列常用來指向字串,方便字串的處理

陣列引數  指標引數

一維陣列的傳參:


沒有報錯,說明圖中的傳參方式都可以作為一維陣列的傳參方式

二維陣列的傳參:

 

當執行這段程式碼的時候,會出現第一個函式的報錯,提示缺少下標,當我們在一個函式的引數的第二個中加上二維陣列的列數:

5,則編譯通過,說明二維陣列在傳參的過程中是必須要傳列數的。

一級指標傳參

當一個函式的引數部分是一級指標的 時候,那麼此時我們可以給引數傳進去一個地址,因為指標裡面就是地址,也可以傳進去一個指標,此時編譯都可以通過,所以,我們在一定的程度上就可以把:地址=指標

二級指標傳參


在執行如圖程式碼之後,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函式進行32 加運算

函式指標陣列的指標

既然陣列可以用指標指,叫做陣列指標,那麼函式指標陣列也可用指標指起來,叫做:函式指標陣列的指標,顧名思義,這個指標指向了一個數組,這個陣列叫做函式指標陣列,數組裡面的元素存放的是函式的指標,這些函式的指標,分別的指向了特定的函式。

如何定義:

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

}