我有以下代码段,
&main
和&user
在这里描述了什么?
每次我运行它为什么给出不同的值?
在什么情况下传递& function_name是有用的?
int user()
{
return 0;
}
int main()
{
int a, b = 0;
a = ((int)&main);
b = ((int)&user);
cout << a <<" " << b;
return 0;
}
答案 0 :(得分:0)
它描述了你的功能的地址。每次运行它的原因各不相同,是因为你的程序每次都可能没有使用相同的内存空间。
&amp; main为您提供主函数的地址,就像&amp; var给出了一个名为var的变量的地址。强制转换为int可能存在问题。 64位系统上的指针是64位宽,int可能不会那么长。
答案 1 :(得分:0)
大多数示例归结为 回调 :您调用函数
f()
传递另一个函数g()
的地址,f()
调用g()
对于某些特定任务。如果您通过f()
地址h()
相反,然后f()
会回拨h()
。基本上,这是一种 参数化 函数的方法:某些部分 它的行为不是硬编码到
f()
中,而是硬编码到回调中 功能。调用者可以通过传递使f()
表现不同 不同的回调函数。经典是来自C的qsort()
标准库,它将排序标准作为指向a的指针 比较功能。在C ++中,这通常是使用 函数对象 完成的(也称为 仿函数)。这些是重载函数调用操作符的对象, 所以你可以称它们为功能。示例:
class functor { public: void operator()(int i) {std::cout << "the answer is: " << i << '\n';} }; functor f; f(42);
这背后的想法是,与函数指针不同,它是一个函数 对象不仅可以携带算法,还可以携带数据:
class functor { public: functor(const std::string& prompt) : prompt_(prompt) {} void operator()(int i) {std::cout << prompt_ << i << '\n';} private: std::string prompt_; }; functor f("the answer is: "); f(42);
另一个优点是内联调用有时更容易 函数对象比通过函数指针调用。这是一个 之所以在C ++中排序有时比在C中排序更快。