理解C ++中的声明

时间:2015-08-03 13:51:25

标签: 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;
}

5 个答案:

答案 0 :(得分:11)

使用螺旋规则:

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

fn是一个指向函数的指针,该函数接受两个参数(名为int&的{​​{1}}和名为a的{​​{1}}并返回int* }。使用自由函数b初始化函数指针。

所以你的代码在哪里:

void

这可以等同于:

add

答案 1 :(得分:8)

add是一个指向函数的指针,该函数从左到右依次为addfn,但不会返回任何内容。

将[{1}}功能分配给int&

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

这种技术的一个用途是在回调函数的建模中。例如,fn需要排序谓词的回调函数。函数指针在C中比在C ++中更常见,在C ++中还有其他技术,如函数对象,模板,lambda甚至add

答案 2 :(得分:4)

如果您阅读the clockwise/spiral rule,声明很容易破译:

您向函数声明一个变量class Foo(mixins.ListModelMixin, viewsets.GenericViewSet): queryset = User.objects.all() serializer = UserSerializer ,它是一个指针,接受一些参数并且不返回任何内容。

然后你使这个函数指针list指向fn函数。

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

答案 3 :(得分:3)

void (* fn) (int& a, int* b) = add;声明名为fn的{​​{3}},其指向指向void(int&,int*)签名的函数。然后它将指针用于add()函数。

答案 4 :(得分:1)

使用right-left rule可以轻松阅读此类复杂的声明,即使在the clockwise spiral rule fails时也可以使用boustrophedonically,即使在int* a[][10]这样简单的情况下也是如此。

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

从标识符fn开始,从右向左移动,括号翻转方向。所以fn是一个指向函数的指针,它引用了int和一个指向int的指针,函数的返回类型是void

它被称为阅读this answer :)另请参阅enter image description here