理解C++中的声明

Sul*_*223 5 c++ pointers reference

我正在简单地阅读C++,并且遇到了一段我不理解的参考和指针代码.

代码是void (* fn) (int& a, int* b) = add;.据我所知,它不会影响程序本身,但想知道这段代码的作用.

#include <iostream>
using namespace std;

void add (int& a, int* b)
{
    cout << "Total: " << (a+ *b) << endl;
}

int main()
{
    int num = 100, sum = 200;
    int rNum = num;
    int* ptr = &num;

    void (* fn) (int& a, int* b) = add;

    cout << "reference: " << rNum << endl;
    cout << "pointer: " << *ptr << endl;

    ptr = &sum;
    cout << "pointer now: " << *ptr << endl;
    add(rNum, ptr);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 11

使用螺旋规则:

     +----------------------+
     |  +--+                |
     |  ^  |                |
void (* fn ) (int& a, int* b) = add;
^    |     |                |
|    +-----+                |
+---------------------------+
Run Code Online (Sandbox Code Playgroud)

fn是一个指向函数的指针,该函数接受两个参数(int&命名aint*命名b)并返回void.使用free函数初始化函数指针add.

那么你的代码在哪里:

add(rNum, ptr);
Run Code Online (Sandbox Code Playgroud)

这可以等效地替换为:

fn(rNum, ptr);
Run Code Online (Sandbox Code Playgroud)


Bat*_*eba 8

fn是一个指向函数的指针,从左到右,a int&和a int*,它不返回任何东西.

分配的功能addfn.

可以add通过指针调用该函数,使用与您使用时完全相同的语法add.

该技术的一个用途是在回调函数的建模中.例如,qsort需要一个用于排序谓词的回调函数.函数指针在C中比在C++中更常见,在C++中还有其他技术,如函数对象,模板,lambda甚至std::function.