C 函数的名称。它是指向该函数的指针吗?

C 函数的名称。它是指向该函数的指针吗?,c,function,function-pointers,function-calls,C,Function,Function Pointers,Function Calls,当我们使用函数名传递参数时,是否使用指向该函数的指针 例如: int foo(int a, int b); int main(void) { int a = foo(1,3); //foo() it's a pointer to the function foo()? return 0; } 您要查找的术语是函数指示符。它不是指针类型,但大多数情况下,它会转换为指针类型 引用C11标准第§6.3.2.1章(重点) 函数指示符是具有函数类型的表达式。除非它是 sizeof运算符

当我们使用函数名传递参数时,是否使用指向该函数的指针

例如:

int foo(int a, int b);

int main(void)
{
    int a = foo(1,3); //foo() it's a pointer to the function foo()?
    return 0;
}

您要查找的术语是函数指示符。它不是指针类型,但大多数情况下,它会转换为指针类型

引用
C11
标准第§6.3.2.1章(重点)

函数指示符是具有函数类型的表达式。除非它是
sizeof
运算符的操作数,
\u Alignof
运算符,65)或一元
&
运算符的操作数,a 类型为“函数返回类型”的函数指示符转换为类型为“指向函数返回类型的指针”的表达式。

相关,来自规范第6.5.2.2章“函数调用”部分

表示被调用函数(92)的表达式应具有指向函数的类型指针 返回void或返回数组类型以外的完整对象类型


这告诉我们,在函数调用时,指示符实际上会转换为指针。

否,它只调用函数。函数名作为参数传递时会衰减为指针。这就是你真正应该关心的。它确实编译成一个跳转到函数代码的地址,所以它是一个指针,但这不是通常对指针的理解。此外,任何变量都可以理解为指向内存中某个空间的指针。这实际上是一个微妙的问题,答案更像是“类”而不是“否”。实现对
foo
调用的机器指令中有一个地址,或者可能指的是一个包含地址的寄存器。因此,在某种意义上,保存地址(机器指令或寄存器中的字)的内存在机器级充当指针。但是,这些指针与
int(*)(int,int)
类型的C变量的含义不同。该变量通常存在于数据内存(堆栈或数据段)中。@SouravGhosh,我看到函数指针,我有这个问题。