理解C+中的声明+; 我在阅读C++的过程中,遇到了一段我不理解的引用和指针的代码。

理解C+中的声明+; 我在阅读C++的过程中,遇到了一段我不理解的引用和指针的代码。,c++,pointers,reference,C++,Pointers,Reference,代码为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

代码为
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;
}
#包括
使用名称空间std;
无效添加(内部&a、内部*b)
{
不能使用螺旋法则:

     +----------------------+
     |  +--+                |
     |  ^  |                |
void (* fn ) (int& a, int* b) = add;
^    |     |                |
|    +-----+                |
+---------------------------+

fn
是一个指针,指向一个函数,该函数有两个参数(一个名为
a
int&
和一个名为
b
int*
)并返回
void
。函数指针由自由函数
add
进行复制初始化

因此,您的代码中有:

add(rNum, ptr);
这可以等效地替换为:

fn(rNum, ptr);
如果您阅读了有关该声明的内容,则很容易理解:

您可以声明一个变量
fn
,它是指向函数的指针,接受一些参数,但不返回任何内容

然后使此函数指针
fn
指向
add
函数


然后可以使用函数指针,而不是直接调用
add

fn
是指向函数的指针,该函数从左到右取
int&
int*
,不返回任何内容

您正在将函数
add
分配给
fn

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


<> P>一个使用的技术是在回调函数的建模中,例如,代码> qSoS/<代码>需要排序谓词的回调函数。函数指针在C中比C++中更常见,在其他技术中,如函数对象、模板、lambdas,甚至<代码> STD::函数 .< /P> <代码>代码>空隙(*FN)。(int&a,int*b)=add;
声明一个命名的
fn
指向一个签名为
void(int&,int*)
的函数。然后初始化指向
add()的指针
函数。

这样复杂的声明很容易使用读取,即使在使用像
int*a[][10]
这样简单的函数时也可以使用

void (* fn) (int& a, int* b);
从标识符
fn
开始,从右到左,括号翻转方向。因此
fn
是指向函数的指针,函数引用
int
,指针指向
int
,函数的返回类型为
void


它被称为reading:)请参阅另一个例子。

是一个很好的声明网站。不过,它在这个网站上遇到了问题。此指令分配变量
fn
,一个指向函数的指针,一个指向函数
add
的指针的值,以后不会使用该赋值,而且该赋值基本上是无用的。@a我们可能是因为引用不在C语言中,你也不能在声明中命名参数。这里没有赋值,即使有赋值,也会是
add
赋值给
fn
,而不是相反。对了,在我脑子里翻了翻。修复了。可能比螺旋规则更好,因为像s
int*a[5][10]
?@legends2k这两个规则都很糟糕,每个人都应该使用typedefs:)哈哈,没错,使用
typedef
s会更好。然而,一旦我们进入解密此类声明的行业,这类声明确实经常在野外出现,RL规则是首选的,因为它可以处理即使螺旋规则失败的情况:)