今天要給大家分享的是指標的用法。
話不多說,先來定義乙個簡單的指標:
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 表示函式指標,可以指向無參,且返回值為整型指標的函式。右左規則 因為...