功能指针分配

时间:2019-09-23 06:10:49

标签: c

在以下代码中,我有几个问题:

  1. 不带符号&的函数名称如何给出函数的地址值?这是由于编译器的智能吗?还是这种允许的c语法?

  2. 是否可以将名称fun重用于任何变量声明?是否应该进行任何链接器拆解以实现此目的?

void fun(int a) 
{ 
    printf("Value of a is %d\n", a); 
}  

int main() 
{  
    void (*fun_ptr)(int) = fun;  
    fun_ptr(10);   
    return 0; 
}

3 个答案:

答案 0 :(得分:0)

standard中所述,由于函数到指针的转换,对于函数指针,不必使用&

void f(int);
void (*pf1)(int) = &f;
void (*pf2)(int) = f; // same as &f

答案 1 :(得分:0)

函数,如数组,自然会衰减到指针。在期望使用指向函数的指针时使用fun会使编译器将其视为&fun

不,您不能使用fun作为变量名,因为这将隐藏具有相同名称的函数,这意味着您不能使用函数{{1} }(在该范围内,fun的所有用法都引用了变量)。这种隐藏发生在编译中。

答案 2 :(得分:0)

函数指定符(即在表达式中使用fun时所拥有的)是C语言的定义部分,而不是{{1 }},sizeof或一元运算符_Alignof的值等于指向该函数的指针。因此,您的&声明就可以了。

void (*fun_ptr)(int) = fun;不能在文件作用域中用作另一个声明符,无论它是变量还是其他函数。您可以 在块范围内使用变量声明对其进行阴影处理(这同样适用于文件范围的变量声明)。