#include <bits/stdc .h>
using namespace std;
void test(){
int a = 100;
cout << a << endl;
}
int main()
{
void(*b)() = test;
(*b)(); //expression one
b(); //expression two
return 0;
}
test is a pointer to function, isn't it? (*b)() is a correct form, because it is equivalent to function prototype. But Why is it correct to delete a symbol *? They all produced the right results.
CodePudding user response:
testis a pointer to function, isn't it?
No, it isn't. test is a function.
b is a pointer to function.
But Why is it correct to delete a symbol *?
Because you can also invoke the function call operator on function pointers, and not just functions.
Furthermore, since a function can implicitly convert to a function pointer, this is also equivalent:
(********b)();
What is the difference between these two expressions
One indirects through function pointer and invokes function call operator - which calls the pointed function.
The other invokes function call operator on a function pointer - which implicitly indirects through the pointer and calls the pointed function.
The former requires 3 more characters to write.
CodePudding user response:
test is the function, b is a pointer to function (which points to test); and pointer to function could be used in function-call expression directly.
A pointer to function can be used as the left-hand operand of the function call operator, this invokes the pointed-to function:
Dereferencing a function pointer yields the lvalue identifying the pointed-to function:
int f(); int (*p)() = f; // pointer p is pointing to f int (&r)() = *p; // the lvalue that identifies f is bound to a reference r(); // function f invoked through lvalue reference (*p)(); // function f invoked through the function lvalue p(); // function f invoked directly through the pointer
Dereference on b like *b you'll get the pointed function test. As the effect, (*b)(); and b(); do the same thing, i.e. invoke test.
CodePudding user response:
Well, to explain this properly, I need to start from the very basics.
Let's consider the following function:
void function(){
// body
}
When the compiler compiles this function, function is a symbol representing the address where the function body is located in memory. So, the value of function is the memory address and can be seen as a pointer.
() is an operator that tells the computer to execute whatever is stored at the memory address that is referenced before.
Ignoring the type-checking, we could technically call the ()-operator on any pointer or address. However, to avoid potential bugs, we have type checking to prevent, for instance, operator-() being called on a data pointer.
So in practical terms, the following can be used:
function()
auto f1 = function
f1()
void (*f2)() = f2
f2()
void (&f3)() = function
f3()
