在执行function指针时,使用地址运算符与不使用它的目的是什么?

对于以下代码段,我为什么要使用一个赋值与另一个赋值? 谢谢

void addOne(int &x) { x +=1; } void (*inc)(int &x) = addOne; // what is the purpose of doing "addOne" void (*inc)(int &x) = &addOne; // vs &addOne ?? int a = 10; inc(a); 

一个在另一个的目的是C兼容性。 C表示函数会自动衰减为指向函数的指针。 为了兼容,C ++必须做同样的事情。

请注意,当C ++引入了新的函数指针类型(成员函数指针)时,它们不会自动衰减。 因此,如果C ++委员会有他们的方式,那么你需要那么好的机会。

简洁,风格。 调用它们时使用*也是一样的。

另请注意array vs &array[0]

C ++ Programming Languauge一书中可以清楚地看出&*运算符是函数指针的可选项:

一个函数只能做两件事:调用它并获取它的地址。 通过获取函数的地址获得的指针然后可用于调用该函数。 例如:

 void error (string s) { /* ... */ } void (*efct )(string ); // pointer to function void f () { efct = &error ; // efct points to error efct ("error "); // call error through efct } 

编译器会发现efct是一个指针并调用指向的函数。 也就是说,使用*取消引用函数的指针是可选的。 同样,使用&来获取函数的地址是可选的:

 void (*f1 )(string ) = &error ; // ok void (*f2 )(string ) = error ; // also ok; same meaning as &error void g () { f1 ("Vasa"); // ok (*f1 )("Mary Rose"); // also ok } 

正如其他人所指出的,在C ++中, 指向成员函数的指针是新的/不同的。 &不是指向成员的可选项,它被解释为(在C ++ Programming Languauge Book中):

可以通过将address-of运算符&应用于完全限定的类成员名称来获取指向成员的指针,例如&Std​​_interface :: suspend。

一个函数已经是一个指针; 因此,您不需要地址运算符。