函数指针的地址和函数指针的内容是一样的吗?

时间:2014-09-15 12:16:49

标签: c pointers function-pointers

我试过这段代码

  1 #include <stdio.h>
  2
  3 int  sum(int a,int b)
  4 {
  5  printf ("\nFun sum called");
  6  return a+b;
  7 }
  8
  9 int main()
 10 {
 11  int a=5;
 12  int b=6;
 13  printf("\n 1. %d",sum(a,b));
 14  printf("\nAddress of sum : %p",&sum);
 15  int (*fptr)(int,int) = NULL;
 16  fptr = &sum;
 17  printf("\n 2. %d",fptr(a,b));
 18  printf("\nAddress of fptr is %p and fptr is %p",fptr,*fptr);
 19  return 1;
 20 }

我的输出是

 Fun sum called
 1. 11
 Address of sum : ***0x400498***
 Fun sum called
  2. 11
 ***Address of fptr is 0x400498 and fptr is 0x400498***

为什么函数指针的地址和函数指针内的地址所持的内容看起来是一样的?

他们应该是不同的!我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

不,他们不应该有所不同,因为你写道:

fptr = &sum;

所以fptr指向sum函数的地址。我想你想得到函数指针的地址,而不是函数指针指向的地址,所以你需要打印:&fptr。这将是不同的。

TL; DR版本:fptr, *fptr, &fptr - 你需要知道它之间的区别。

答案 1 :(得分:1)

fptr不是此变量的地址,此变量的值

由于您设置了fptr = &sum,因此您实际上是在执行:

printf("\nAddress of sum is %p and sum is %p",&sum,sum);

实际上,代表函数的符号的地址和值是相同的。


值得注意的是,相同的行为适用于表示数组的符号。

这些符号(函数和数组)的常见之处在于它们是常量。

换句话说,一旦你宣布了这样的符号,就不能将它设置为不同的值。


如果您想比较地址和fptr的值,那么您应该执行:

printf("\nAddress of fptr is %p and fptr is %p",&fptr,fptr);

除非您设置fptr = &fptr,否则肯定会打印两个不同的值。