1. 程式人生 > >C++小知識——指標函式和函式指標、指標陣列和陣列指標示例

C++小知識——指標函式和函式指標、指標陣列和陣列指標示例

一、指標函式和函式指標

1.1 指標函式

指標函式,其實就是返回值為指標的函式
例如:
long *func(int)
它是一個名為func,返回值為long *,引數為int的指標函式

1.2 函式指標

就像陣列名是指向陣列第一個元素的常指標一樣,函式名指向函式的常指標

可以宣告一個指向函式的指標變數,並且用這個指標變數去呼叫其他函式,此時,需要函式指標這個被呼叫函式返回值和引數列表方面相同
例如:
long (*func)(int)
這裡的func就是函式指標,它指向一個返回值為long,引數列表是int的函式

1.3 指標函式和函式指標的一些例子

示例1:int (*(*func)(int , int))(int)
說明:這裡func是一個函式指標,指向一個返回值為一個指標,引數列表為(int, int)的函式。
而這個函式返回的指標又指向一個返回值為int,引數列表也為int的函式。

示例2:float (**def)[10];
說明:def是一個二級指標,它指向一個指標,這個指標指向一個能存放10個float型別元素的陣列

示例3:double*(*gh)[10];
說明:gh是一個指標,它指向一個能存放10個double*型別元素的陣列

示例4:double (*f[10])();


說明:f是一個含有10個元素的陣列,數組裡的每一個元素都是函式指標,指向一個返回值型別為double,形參表為空的函式

示例5:int*((*b)[10]);
說明:b是一個指標,指向一個能存放10個int*型別元素的陣列


二、指標陣列和陣列指標

指標陣列:即存放元素是指標的陣列,例如int *ptr[];陣列ptr[]裡存的是地址
陣列指標:即指向陣列的指標,例如int (*ptr)[];

對於一個二維陣列,可以這樣表示:
int v[2][10] = { {1,2,3,4,5,6,7,8,9,0}, {11,12,13,14,15,16,17,18,19,20} };


也可以這樣:int (*a)[10] = v;,這裡a是一個指標,指向一個10個int元素的陣列
a+1:表明指標a向後移動1*sizeof(陣列大小),對上面的例子,共向後移動40個位元組
*a+1:僅針對這一行向後移動4個位元組
在這裡插入圖片描述

示例1:int (*a[10])(int);
說明:a是一個有10個指標的陣列,該指標指向一個返回值和引數都為int的函式
解析:
① 一個有10個指標的陣列:*a[10];
② 該指標指向一個函式:(*a[10])();
③ 該函式有一個整形引數: (*a[10])(int);
④ 並返回一個整型數: int (*a[10])(int)
所以int (*a[10])(int)
方法:閱讀這種表示式的時候可以遵循以下的規則:從右向左,由近及遠,括號優先;比如從a符號開始。其右邊是[10],說明a是個陣列,其中存了十個元素。再看a的左邊是一個*。說明陣列中存的是指標。現在在看(*a[10])的右邊是(int);說明所存的指標是指向有一個int形參的函式現在看(*a[10])的左邊是個int ,說明指向的函式的返回值為int型別

示例2:int (*(*p)[10])(int*)
p是一個指標,p這個指標指向一個數組,陣列元素是指標,陣列元素的指標指向一個函式,這個函式引數是int*,返回值是int

示例3:
在這裡插入圖片描述
這裡的第二個結果為什麼是5呢?
首先,賦值語句int *ptr = (int*)(&a + 1);表示ptr指向a陣列最後一個元素的下一個元素,即第六個元素,儘管它不存在。
時刻牢記:陣列名本身就是一個常指標,加上&,就變成了二級指標,這裡的二級指標指的是二維陣列,+1就是陣列整體加一行