在C和C++中,函数名本身就是一个指向该函数代码的指针。因此,当你以函数名作为参数传递给其他函数时,实际上你传递的是该函数的地址。
对于你的代码,add是一个函数,&add是该函数的地址。由于add本身就代表了函数的地址,所以add和&add的值是相同的。
当你将add作为参数传递给func函数时,你实际上是将add函数的地址传递给了func。在func内部,这个参数被用来调用函数。
同样地,当你将&add作为参数传递给func函数时,你实际上是将add函数的地址再次传递给了func。在func内部,这个参数同样被用来调用函数。
因此,无论你使用add还是&add作为参数传递给func函数,结果都是一样的,因为它们都代表了同一个函数的地址。
举个栗子:
#include <stdio.h> // 引入标准输入输出库。这允许我们使用例如printf这样的函数。
int add(int x, int y) { // 定义一个名为add的函数,它接收两个整数x和y作为参数,
return x + y; // 并返回它们的和。
}
typedef int (*InferHook)(int, int); // 定义一个新的类型别名InferHook,它是一个指向函数的指针,该函数接收两个整数参数并返回一个整数。
int func(InferHook p1){ // 定义一个函数func,它接收一个InferHook类型的参数p1,并使用它来调用函数。
return p1(3,4); // 调用p1所指向的函数,传入参数3和4,然后返回结果。
}
int main(){ // 定义主函数,程序从这里开始执行。
printf("name------%p\naddress-------%p\n",add,&add); // 使用printf打印出add函数的名称(其本身就是一个地址)和其地址。
// "name------%p"是一个格式字符串,表示要打印的是一个内存地址。
// "%p"是一个格式指示符,用于打印地址。
// "add"是我们要打印的第一个变量,即我们要打印的函数add本身。
// "&add"是我们要打印的第二个变量,即add函数的地址。
printf("name------%d\naddress-------%d\n",func(add),func(&add)); // 使用printf打印出两次调用func的结果,第一次传入add函数,第二次传入add函数的地址。
// "name------%d"和"address-------%d"是格式字符串,表示要打印的是整数。
// "func(add)"和"func(&add)"是我们要打印的变量,它们分别是传入func的函数指针和函数地址。
return 0; // 主函数结束,返回0。
}
运行结果:
这里实验证明没什么区别,同时不同的编译器,运行结果可能不同?这里不作深入探究;
个人觉得加上&有种画蛇添足的感觉;
水平有限,有问题随时交流!
欢迎一键三连~