今天吃飯的時候逛了下知乎,發現乙個和函式指標相關的問題
(感覺這種知識點拿來面試簡直無聊,以前在c++prime plus上看到過類似的,只是大概的看了一下,感覺以後應該不怎麼用到…)
問題為,int (*((*ptr(int,int))))(int);
(與int(*(*ptr(int,int)))(int)
等價) 是什麼意思?
看到的時候就有些煩,這種寫法不是刁難我胖虎麼,那就一步一步從右到左分析
(可以看一下這個:從左到右分析的步驟)
我們可以看乙個簡單的例子,int (*ptr(int,int))(int);
首先 ptr的右邊是(int,int),也就是這是乙個函式,而ptr左邊是乙個*,則這是乙個指標(因為*
的左邊是圓括號所以此時應該往右邊讀),即指向int(*)(int)
型別的函式指標,則該函式返回的是int(*)(int)
型別。
再來看看題目, 從ptr這個「函式名」開始,右邊是乙個(int,int),也就是說,ptr是乙個接受(int,int)引數的函式,然後返回的是乙個指標稱為p1,而p1指向誰呢,此時的形式為int (*(p1))(int)
,因為p1的左邊是圓括號,則我們看右邊,右邊為(int),則p1是乙個指標,指向引數為(int)的函式,再讓我們讀左邊(因為右邊是圓括號),左邊為*
,也就是p1指向funciton(int),而這個funciton返回乙個指標,這個指標p2指向p1,也就p2->p1->function(int),則該函式的返回型別也就是為int (**)(int)
(不知道說錯了沒。。。orz)
**測試:
int foo(int a)
decltype(&foo) mptr = &foo;
int(*(*ptr(int a,int b)))(int)
int main()
結果如下:
vs2015顯示mm 變數為乙個二級函式指標。
—————————————————–c++11一些新特性的介紹——————————————————–
int(*(
*ptr(int,int)))(int)
上面的這個**,從上面的分析中我們可以得知,也就是返回乙個 int (**)(int)的函式而已,我們可以使用其他寫法,讓其看起來美觀或者說簡潔,就比如:
using testtype=int (int);
testtype** ptr(int,int);
(using和typedef可以達到差不多的效果,起別名,若是用typedef ,則應該這樣定義)
typedef int (*type)(int);
即定義了乙個int(*)(int)的函式指標。
是不是就通俗易懂了許多。
我們也可以使用一下lamda,也可以達到原函式想要的效果。
using testtype = int(int);
testtype *ss = &foo;
auto mm = [&](int a);
auto m = mm(5);
(*m)(3);
在這先介紹一些std::function的使用吧,在使用cocos2d的時候發現很多c++11的新特性,所以打算在cocos2d文章那裡寫,或者是在c++文章裡重新寫,因為我也只是大概了解如何使用,深入學習則另寫一篇部落格,來詳細看看c++11的新特性
上面,我們使用函式指標,是用using或者是typedef來起別名,來宣告函式指標,在c++11中,有個新特**覺用著挺適用的,那就是std::function
如上面的定義函式指標,我們可以這樣定義
std:
:funciton(int)>m_func;
m_func=foo;
m_func(5);
和函式指標方法差不多,就大概介紹到這了,以後想到什麼就再來補充。。。。 C 11中的一些新特性
c 11擴大了初始化列表的使用範圍,所有的內建型別和使用者自定義型別都可以使用列表初始化,號可新增可不新增。如 int main int arr2 int arr3 newint 5 vector int v1 vector int v2 return0 容器支援花括號列表初始化,本質上是增加了乙個...
C 11的一些功能
1.斷言是將乙個須要為真的表示式放在語句中,在debug 模式下檢查一些邏輯錯誤的引數。c 中使用assert 須要使用 或者標頭檔案。有函式定義例如以下 void fun int a,int n 這樣就能夠檢查n 0 的情況。假設遇到這樣的情況,程式會呼叫abort 函式而終止。c 11 提供了s...
C 11 比較詭異的一些語法
void f int i auto main int 這裡 後面可以使用decltype e 表示式 range for for auto v l default delete 之前是不寫或private 限定 override final using base base 引入基類的建構函式,實際上...