函数指针

此文主要针对编译器对函数名的隐式转换举例说明。

#include <stdio.h>
#include <stdlib.h>

void func(int a)
{
    printf("xxxxxa=%d
", a);
}

int main (int argc, char **argv)
{
    void (* f1)(int )=func;
    printf("f1=%p
", f1);//f1=0x804857d
    void (* f2)(int a)=&func;//f2=0x804857d
    printf("f2=%p
", f2);
  //初始化表达式中&操作符是可选的,因为函数名被使用时总是由编译器将其转换为函数指针
  //&操作符只是显示地说明了编译器将隐式执行的任务
func(
10);//简单使用名字调用函数func,函数名func首先被转换为一个函数指针,该指针指定函数在内存中的位置,然后,函数调用操作符调用该函数,执行开始于这个地址的代码。 f1(1);//函数指针通常用法 (*f2)(2);//对f2执行间接访问操作,他把函数指针转换为一个函数名,但这个转换并不是真正需要的,因为编译器在执行函数调用操作符之前又会把它转换回去 //以上三条语句的指定效果是一样的. return 0; }

综上所述:

函数指针初始化时,是否带&操作符,效果一样。

函数指针使用时,是否使用间接访问操作(*),效果一样。

原文地址:https://www.cnblogs.com/black-mamba/p/6765231.html