函式指標 閱讀順序與C 11一些新特性使用

2021-08-08 04:12:13 字數 2288 閱讀 7332

今天吃飯的時候逛了下知乎,發現乙個和函式指標相關的問題

(感覺這種知識點拿來面試簡直無聊,以前在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 引入基類的建構函式,實際上...