C语言中指向函数的指针详解

下载需积分: 34 | PPT格式 | 112KB | 更新于2024-07-13 | 65 浏览量 | 4 下载量 举报
收藏
"指向函数的指针-函数与指针" 在C语言中,函数不仅可以作为执行特定任务的代码块,还可以被当作一种数据类型来处理。这就是所谓的“函数指针”,它允许我们存储对函数的引用,并在需要时直接调用。函数指针在很多场景下非常有用,例如在回调函数、算法比较或动态执行等功能中。 无参函数指针的定义格式是:`void (*函数指针名)(void)`。例如,我们可以定义一个名为`pFun`的无参函数指针类型: ```c void (*pFun)(void); ``` 有参函数指针的定义格式则是:`type (*函数指针名)(参数类型表)`。例如,定义一个接受两个整数并返回它们之和的函数指针`pFun`: ```c int (*pFun)(int, int); ``` 在C程序设计实践中,理解函数的声明和定义非常重要。函数定义通常包含函数类型、函数名以及参数列表,如`int add(int x, int y)`。而函数声明则用于告诉编译器函数的存在,但不包含函数体,例如: ```c int add(int x, int y); // 函数声明,参数名可以省略 ``` 在多文件的程序工程中,通常将函数的声明放在头文件(`.h`)中,作为接口提供给其他文件,而函数的实现放在源文件(`.c`)中。这样,每个功能模块的接口和实现相分离,提高了代码的可读性和可维护性。 调用函数的方式有两种:直接调用和作为参数传递。直接调用如`iSum = add(123, 98)`,而作为参数传递如`printf("Sum=%d\n", add(789, -56))`。 函数参数传递遵循“值传递”原则,这意味着在函数调用时,实参的值会被复制给形参。例如,以下代码无法交换变量`a`和`b`的值: ```c void swap(int x, int y) { int t; t = x; x = y; y = t; } int main(void) { int a = 5, b = -3; swap(a, b); printf("%d,%d", a, b); // 结果:5,-3 return 0; } ``` 原因在于形参`x`和`y`在函数内部是独立的,它们的修改不会影响到实参。要实现交换,我们需要传递变量的地址,而不是它们的值,这样就可以通过指针间接修改实参的值: ```c void swap(int *x, int *y) { int t; t = *x; *x = *y; *y = t; } int main(void) { int a = 5, b = -3; swap(&a, &b); printf("%d,%d", a, b); // 结果:-3,5 return 0; } ``` 通过这种方式,我们成功地实现了交换,因为指针`x`和`y`指向了实参`a`和`b`的内存地址,从而能够在函数内部修改它们的值。

相关推荐