Gra*_*Guy 47 c pointers function-pointers function
所以我想在制作函数指针时,你不需要operator &获取初始函数的地址:
#include <stdio.h>
double foo (double x){
return x*x;
}
int main () {
double (*fun1)(double) = &foo;
double (*fun2)(double) = foo;
printf("%f\n",fun1(10));
printf("%f\n",fun2(10));
printf("fun1 = %p \t &foo = %p\n",fun1, &foo);
printf("fun2 = %p \t foo = %p\n",fun2, foo);
int a[10];
printf(" a = %p \n &a = %p \n",a,&a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
>./a.out
100.000000
100.000000
fun1 = 0x4004f4 &foo = 0x4004f4
fun2 = 0x4004f4 foo = 0x4004f4
a = 0x7fff26804470
&a = 0x7fff26804470
Run Code Online (Sandbox Code Playgroud)
然后我意识到这对于数组也是如此,这意味着如果你有int a[10]两个a并&a指向相同的位置.为什么这是数组和函数?地址是否保存在与其中保存的值(地址)具有相同地址的内存位置中?
Jam*_*lis 66
鉴于int a[10],双方a并&a产生相同的地址,是的,但它们的类型是不同的.
a是类型的int[10].当它被隐式转换为指针类型时,指针是类型int*并指向数组的初始元素. &a是类型int (*)[10](即指向十个整数数组的指针).因为数组中没有填充,它们都会产生具有相同值的指针,但指针具有不同的类型.
函数类似于数组,但不完全相同.你的功能foo是类型的double(double).无论何时foo在表达式中使用并且不是一元运算&符的操作数,它都会隐式转换为指向其自身的指针,该指针属于类型double(*)(double).
因此,出于所有实际目的,函数的名称和指向同一函数的指针是可互换的.有一些细微之处,我在回答"为什么所有这些疯狂的函数指针定义都能正常工作?正在发生什么?"时回答了所有这些细微之处.(这个问题是关于C++的问题,但C++中非成员函数的规则与C中的函数相同.)
不,没有专门用于指向函数/数组的额外存储空间.
大多数变量variable_name除了获取该变量的地址之外还有其他含义,因此您需要使用它&variable来获取地址.
对于函数或数组,function_name(本身,后面没有括号)没有任何其他含义,因此将它解释为获取函数的地址没有问题.
同样反过来:普通指针需要显式解除引用,但指向函数的指针不会(再次,因为没有其他合理的解释),所以给定一个指向函数的指针,如:
int (*func)(param_list);
Run Code Online (Sandbox Code Playgroud)
以下是彼此相同的 - 都调用任何功能func点:
(*func)(params);
func(params);
Run Code Online (Sandbox Code Playgroud)