Wons' Blog

个人博客

Android程序猿


回首向来萧瑟处,也无风雨也无晴

C语言中的函数名与函数指针

函数指针是指向函数的指针变量。因而“函数指针”首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数的参数。

1.函数指针变量

函数的地址也可以像数据变量一样存储在一个函数指针变量里。然后就可以通过函数指针来调用对应的函数了。 如果有一个函数:

void DemoFunc(int n)
{
	printf("val:%d\n", n);
}

声明一个指向DemoFunc的函数指针:

void (*Fun)(int);   //也可写成void (*Fun)(int n);

2.用函数指针调用函数

声明一个函数指针Fun之后,可以将其赋值为DemoFunc的地址,然后通过Fun函数指针调用DemoFunc:

void DemoFunc(int n)
{
    printf("val:%d\n", n);
}

void main()
{
    DemoFunc(1);     	//直接调用

    void (*Fun)(int);
    Fun = &DemoFunc;  	//将DemoFunc函数的地址赋给Fun变量
    (*Fun)(20);    		//通过函数指针Fun来调用DemoFunc。
}

在这里DemoFunc与Fun的类型关系看着类似于int 与int* 的关系。

3.调用函数的其它格式

函数指针也可如下使用,来完成同样的事情:

void DemoFunc(int n)
{
	printf("val:%d\n", n);
}

void main()
{
	void (*Fun)(int);

	Fun = DemoFunc;  //将DemoFun函数的地址赋给Fun函数指针
	Fun(1);    		//这是通过函数指针变量调用DemoFunc函数的。
}

还可如下调用:

void main()
{
   Fun = &DemoFunc;  //将DemoFun函数的地址赋给Fun变量
   Fun(1);    		 //这是通过函数指针变量来调用DemoFunc函数的。
}

这样也行:

void main()
{
   Fun = DemoFunc;  //将DemoFun函数的地址赋给Fun变量
   (*Fun)(1);    //这是通过函数指针变量来调用DemoFunc函数的。
}

其实函数还可以这样调用:

void main()
{
	(*DemoFunc)(1);
}

4. 总结

  1. DemoFunc的函数名与Fun函数指针都是一样的,即都是函数指针。DemoFunc函数名是一个函数指针常量,而Fun是一个函数数指针变量。
  2. 函数名调用如果都得如(*DemoFunc)(1);这样,书写起来很不方便。所以C语言的设计者设计成也可允许DemoFunc(1)这样调用。
  3. 为统一起见,Fun函数指针变量也可以Fun(10)的形式来调用。
  4. 赋值时,既可以Fun = &DemoFunc这样的形式,也可Fun = DemoFunc。
最近的文章

Python程序隐藏控制台

Python程序有时需要隐藏控制台,让进程在后台继续运行而不显示控制台。这时可以用ctypes库实现:import ctypesdef hide_console(): whnd = ctypes.windll.kernel32.GetConsoleWindow() if whnd != 0: ctypes.windll.user32.ShowWindow(whnd, 0) ctypes.windll.kernel32.CloseHandle(whnd)…

Python继续阅读
更早的文章

Windows下从dll中导出lib文件

在Windows平台上使用MSYS编译一些开源代码时经常只会生成DLL文件,有事获取的SDK也可能丢失lib文件,而如果打算在VS中使用DLL则需要有对应的LIB文件,以下方法介绍如何从DLL文件中导出LIB文件。此方法有两个步骤:由dll文件生成def文件; 由def文件导出lib文件。1. 通过pexports或微软编译环境自带的dumpbin.exe导出DLL对应的def文件:pexports ***.dll > ***.def2. 通过微软编译环境自带的lib.exe程序根据...…

Windows继续阅读