函数名称add 与 &add 作为参数传入的区别与探讨

在C和C++中,函数名本身就是一个指向该函数代码的指针。因此,当你以函数名作为参数传递给其他函数时,实际上你传递的是该函数的地址。

对于你的代码,add是一个函数,&add是该函数的地址。由于add本身就代表了函数的地址,所以add和&add的值是相同的。

当你将add作为参数传递给func函数时,你实际上是将add函数的地址传递给了func。在func内部,这个参数被用来调用函数。

同样地,当你将&add作为参数传递给func函数时,你实际上是将add函数的地址再次传递给了func。在func内部,这个参数同样被用来调用函数。

因此,无论你使用add还是&add作为参数传递给func函数,结果都是一样的,因为它们都代表了同一个函数的地址。


举个栗子:

#include   // 引入标准输入输出库。这允许我们使用例如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。  
}

运行结果:

这里实验证明没什么区别,同时不同的编译器,运行结果可能不同?这里不作深入探究;

个人觉得加上&有种画蛇添足的感觉;

水平有限,有问题随时交流!

欢迎一键三连~

你可能感兴趣的:(Cpp,c++)