我的第一个疑问是:
函数名是指针变量吗?哪个变量的地址是指针控件? (在这个程序中变量的地址添加指针保存)。
和 如果我写'&'在加入之前,程序运行正常。编译器会自动添加'&'在编译期间???
#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。
答案 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"); }