函数名是指针变量吗?

时间:2017-07-23 08:09:55

标签: c

我的第一个疑问是:

函数名是指针变量吗?哪个变量的地址是指针控件? (在这个程序中变量的地址添加指针保存)。

和 如果我写'&'在加入之前,程序运行正常。编译器会自动添加'&'在编译期间???

#include<stdio.h>
int addition(int, int);
int main() 
{
int (*p)(int, int);
int sum;
p=addition;  // if I add '&'  before function name the            
//program runs fine. (&addition).
sum=p(10, 20);
printf("Sum is %d\n", sum);
return 0;
} 
int addition(int x, int y)
{
int r;
r=x+y;
return r;
}

输出为:Sum为30。

4 个答案:

答案 0 :(得分:2)

0L

这里你要声明一个指向函数的指针。

int (*p)(int, int); 您将p = addition;指向p功能。 就像声明的变量具有地址一样,函数也有自己的地址。 因此,通过这样做,您将addition的地址分配给addition,从而将p分配给p函数。

希望这个解释清除你的怀疑。

就像数组一样,将函数的函数名称或地址赋给指针变量也是一样的。 所以你可以选择在添加之前放置addition

答案 1 :(得分:1)

在C中,使用值上下文中的函数名称隐式地给出该函数的地址。它没有别的东西可以给,所以这是一个方便。但是正如您所发现的那样,在前面使用明确的&也是有效的。结果是相同的。

答案 2 :(得分:0)

函数的名称不是指针。您所看到的是表达式在C语言中的工作原理。

但是,在

这样的表达式中使用时
 p = addition;

函数的名称隐式转换为指针。在此上下文中,p = addition(隐式地将addition转换为指针,并将结果分配给p)和p = &addition(它计算具有相同值的指针,并且将结果赋给p)具有相同的净效果。

答案 3 :(得分:0)

函数名称是指针式的,函数指针类似于函数:

#include <stdio.h>
void hw(void) { puts("hello world"); }
int main()
{
    /*all three work*/
    hw();
    (&hw)();
    (*&hw)();
}

这使得它们有点像数组,因为它们会自动转换为指针并且你无法真正获得 到一个函数(一个操作码块)的“值”,这是因为 C没有任何操作。

函数和函数指针之间的区别很模糊 在C语言的大多数情况下,如果你typedef确实会出现。

#include <stdio.h>
typedef void void_void_t(void);      //a function typedef
typedef void (*void_void_pt)(void);  //a function pointer typedef
void_void_t hw;  //no storage, only verifies that hw matches the signature
void_void_pt hwp; //a null pointer of the void_void_pt type; takes up memory
void hw(void) { puts("hello world"); }