一文搞懂 C 指標(陣列指標 函式指標)

2021-10-09 22:15:25 字數 4817 閱讀 1033

今天要給大家分享的是指標的用法。

話不多說,先來定義乙個簡單的指標:

int a =1;

int* p1 =

&a;double

** p2 =

nullptr

;

我們知道,上述**段中定義的指標p1,指標型別是int *,指標指向的資料型別是int。指標p2的型別是double **,指標指向的資料型別是double *。理解這句話很重要,這將是後面我們理解更複雜指標的基礎。

在這裡,我先給出一般規律:

從語法的角度看,我們只需將指標宣告語句中的指標名去掉,剩下的部分就是這個指標的型別;將指標宣告語句中的指標名及其左側的乙個*去掉,剩下的部分就是這個指標指向的資料型別。

接下來我們將逐步深入,**更複雜的指標型別。

1. 指標陣列

所謂指標陣列,意思是主體是陣列,陣列元素是指標。我們定義陣列的常規方法是:datatype arrayname[arraylength];。所以,當我們需要定義乙個指標陣列時,只需要將資料型別設定為指標即可。

int

* a[3]

;

上述語句就宣告了乙個指標陣列,陣列長度為3,陣列元素型別為int *

2. 陣列指標

類似地,所謂陣列指標,主體是指標,指標指向的資料型別是陣列。我們定義指標的常規方法是:pointingtype * pointname;。所以,當我們需要定義乙個陣列指標時,只需要將指標指向的資料型別設定為陣列即可。

乙個問題:如何表示乙個陣列型別呢?我們知道,陣列有兩個要素:元素型別、陣列長度。

那麼,我們似乎可以這樣定義乙個陣列指標:

int(*

)[3] p =

nullptr

;

其實,指標的原型確實是這個樣子的,但是為了方便與美觀,我們習慣將指標名提前,寫成下面這個樣子:

int

(*p)[3

]=nullptr

;

上面的**段表示:指標p指向的乙個元素為int[3]陣列的陣列,這與我們將*p去掉後剩餘的部分一致。如下所示:

int a[2]

[3]=

,};int

(*p)[3

]= a;

cout << a[1]

[1]<<

" "<< p[1]

[1]<< endl;

// 5 5

3. 函式指標

函式指標,顧名思義,就是指向函式的指標。有了陣列指標的基礎,函式指標就很容易理解了。函式也有兩個要素:返回型別、引數型別列表。

先來看乙個函式的定義:

int

sum(

int a,

int b)

那麼,我們可以如下所示定義乙個函式指標:

int

(*f)

(int

,int

)= sum;

cout <1,2)

<< endl;

// 3

我們將*f去掉後,剩下的int (int, int)就表示乙個有兩個整型引數並返回乙個整形值的函式

在 c 語言中,基礎的指標就是上面三種。但為何說指標很難學呢?是,基礎型別的確不難,但是,當他們互相交織在一起的時候,問題就變得複雜了。

1. 定義乙個元素為函式指標的陣列

分析:需求是定義乙個陣列,陣列的元素是函式指標。

// 1. 陣列a[2

]// 2. 函式指標

int(*)

(int

,int

)// 3. 元素為函式指標的陣列

int(

*a[2])

(int

,int)=

nullptr

;

測試如下:

#include

using

namespace std;

intsum

(int a,

int b)

intsub

(int a,

int b)

intmain()

; cout << a[0]

(2,1

)<< endl;

// 3

cout << a[1]

(2,1

)<< endl;

// 1

return0;

}

2. 定義乙個引數是陣列指標、返回型別為空的函式指標

分析:需求是定義乙個函式指標,函式的引數是陣列指標,返回型別為空。

// 1. 陣列指標

int(*)

[2]// 2. 函式指標

void

(*f)()

// 3. 引數是陣列指標的函式指標

void

(*f)

(int(*

)[2]

)=nullptr

;

測試如下:

#include

using

namespace std;

void

calc

(int

(*p)[2

])intmain()

,};void

(*f)

(int(*

)[2]

)= calc;

f(a)

;// 1 2 3 4

return0;

}

3. 定義乙個引數是陣列(元素為函式指標)指標、返回型別為函式指標的函式指標

類似地,我們直接給出**:

#include

using

namespace std;

intsum

(int a,

int b)

intsub

(int a,

int b)

intmul

(int a,

int b)

intdvs

(int a,

int b)

int(

*calc

(int(*

(*p)[2

])(int

,int))

)(int,

int)

intmain()

,};int

(*p1)

(int

,int)=

nullptr

;int(*

(*p2)

(int(*

(*)[

2])(

int,

int)))

(int

,int

)= calc;

p1 =

p2(a)

;// 3, 1, 2, 2

cout <1,2)

<< endl;

// 3

return0;

}

上面這個寫法雖然原理是對的,但是也太***了吧,下面我們用typedef改寫一下!

#include

using

namespace std;

typedef

int(

*pf)

(int

,int);

intsum

(int a,

int b)

intsub

(int a,

int b)

intmul

(int a,

int b)

intdvs

(int a,

int b)

pf calc

(pf (

*p)[2]

)int

main()

,}; pf p1 =

nullptr

; pf (

*p2)

(pf (

*p)[2]

)= calc;

p1 =

p2(a)

;// 3, 1, 2, 2

cout <1,2)

<< endl;

// 3

return0;

}

其實,只要一層一層由簡到繁仔細分析,指標也就那麼回事兒!

C語言 一文讀懂函式指標,指標函式的區別

int functiontopointer int x 意義 函式 functiontopointer是乙個具有乙個int型別的引數,返回值為int型別的指標 的函式。舉例 int larger int int 函式 larger 是乙個具有兩個指向整型的指標的引數,返回值為int型別的指標 的 函...

c 陣列指標 指標陣列 函式指標

優先順序比 高,低於 根據這個原則去判斷 陣列指標 陣列指標即陣列的指標,是乙個指標,指向乙個陣列 也稱為行指標 int p 2 可以理解為int 2 p,但是不能這樣子定義 p是乙個指標,指向乙個陣列,陣列元素是int長度為2 二維陣列可以賦值給陣列指標 int a 3 4 int p 4 p a...

指標陣列,陣列指標,指標函式,函式指標

int p 4 指標陣列。是個有4個元素的陣列,每個元素的是指向整型的指標。int p 4 陣列指標。它是乙個指標,指向有4個整型元素的陣列。int func void 指標函式。無參函式,返回整型指標。int func void 表示函式指標,可以指向無參,且返回值為整型指標的函式。右左規則 因為...