C语言入门:函数指针与程序设计基础

需积分: 16 6 下载量 124 浏览量 更新于2024-08-19 收藏 838KB PPT 举报
"函数指针-达内内部C语言PPT" 在C语言中,函数指针是一个非常重要的概念,它允许我们存储函数的地址并像普通变量一样使用这个地址来调用函数。函数指针可以让我们更加灵活地编写代码,特别是在需要动态执行不同功能或者实现回调机制时。 1. 指向函数的指针: 在C语言中,每个函数都有其唯一的内存地址。函数指针就是这个地址的载体,它能够指向一个特定的函数。声明一个函数指针的语法如下: ```c 返回类型 (*指针名)(参数列表); ``` 例如,如果有一个返回整型并接受两个整数作为参数的函数`int add(int a, int b)`,那么它的函数指针类型可以声明为: ```c int (*add_ptr)(int, int); ``` 2. 将函数作为参数传递: 函数指针可以作为其他函数的参数,这样就可以在运行时决定调用哪个函数。这在处理通用算法或需要根据条件执行不同操作的场景中非常有用。例如,我们可以创建一个通用的处理函数,接受一个函数指针作为参数,然后对一组数据进行处理: ```c void process_data(int *data, int size, int (*operation)(int, int)) { for (int i = 0; i < size - 1; i++) { data[i] = operation(data[i], data[i + 1]); } } int add(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; } int main() { int numbers[] = {1, 2, 3, 4, 5}; process_data(numbers, sizeof(numbers) / sizeof(numbers[0]), add); // 或者 process_data(numbers, sizeof(numbers) / sizeof(numbers[0]), subtract); return 0; } ``` 3. 示例一:对一组数据做不同的处理 在上述示例中,`process_data`函数可以接受不同的操作函数(如`add`和`subtract`),从而根据传入的函数指针对数组中的元素进行加法或减法运算。 4. 示例二:利用不同的排序规则排序 类似的,我们也可以创建一个通用的排序函数,接受一个比较函数指针,用于根据不同的规则对数组进行排序,例如快速排序或冒泡排序: ```c void sort(int *arr, int size, int (*compare)(const void *, const void *)) { qsort(arr, size, sizeof(int), compare); } int ascending(const void *a, const void *b) { return (*(int *)a) - (*(int *)b); } int descending(const void *a, const void *b) { return (*(int *)b) - (*(int *)a); } int main() { int numbers[] = {5, 2, 8, 1, 3}; sort(numbers, sizeof(numbers) / sizeof(numbers[0]), ascending); // 或者 sort(numbers, sizeof(numbers) / sizeof(numbers[0]), descending); return 0; } ``` 总结起来,函数指针是C语言中一个强大的工具,它提供了灵活性和可扩展性,使得我们能够在运行时动态地选择要执行的代码,这对于编写高效、可移植的程序至关重要。通过将函数作为参数传递,我们可以实现函数工厂、策略模式等高级编程技巧,进一步提升代码的复用性和可维护性。在深入学习C语言的过程中,掌握函数指针的使用无疑会极大地提高编程能力。