我正在以简单的步骤阅读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 = #
void (* fn) (int& a, int* b) = add;
cout << "reference: " << rNum << endl;
cout << "pointer: " << *ptr << endl;
ptr = ∑
cout << "pointer now: " << *ptr << endl;
add(rNum, ptr);
return 0;
}
答案 0 :(得分:11)
使用螺旋规则:
+----------------------+
| +--+ |
| ^ | |
void (* fn ) (int& a, int* b) = add;
^ | | |
| +-----+ |
+---------------------------+
fn
是一个指向函数的指针,该函数接受两个参数(名为int&
的{{1}}和名为a
的{{1}}并返回int*
}。使用自由函数b
初始化函数指针。
所以你的代码在哪里:
void
这可以等同于:
add
答案 1 :(得分:8)
add
是一个指向函数的指针,该函数从左到右依次为add
和fn
,但不会返回任何内容。
您将[{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 :)另请参阅。