C语言——函数指针与指针函数
C语言中,函数指针和指针函数是两个容易混淆的概念。它们在语法上非常相似,但实际应用上有一些细微的差别。在本篇博客中,我们将重点介绍C语言中函数指针和指针函数的概念、用法、案例以及它们之间的区别。
概念
函数指针
函数指针是一个指向函数的指针变量。它是一个指针,指向的是函数的起始地址。函数指针可以像普通变量一样被赋值,传递给函数或者从函数中返回。使用函数指针可以实现动态调用函数,方便函数的封装和调用。
指针函数
指针函数是一个返回指针类型的函数。在函数的返回值类型前加上一个 *
符号即可。指针函数返回指向该类型的指针。指针函数可以返回任何类型的指针——包括函数指针。
用法
函数指针
函数指针最常见的用途就是封装回调函数。通过将函数指针作为参数传递给另外一个函数,从而实现在调用这个函数时执行回调函数。例如:
#include<stdio.h>
void printHello()
{
printf("你好啊\n");
}
int getData(int data)
{
data = data + 1;
return data;
}
int main()
{
void (*p)(); //定义函数指针,是一个指针,指向一个函数的地址
p = printHello; //指向函数名
(*p)(); //调用函数
int (*p2)() = getData;
(*p2)(10);
printf("%d",(*p2)(10));
return 0;
}
上述程序中,分别用printHello函数和getData函数定义了函数指针,非常简单的例子。相信大家可以理解。
指针函数
演示一个简单的学生成绩案列,指针函数返回的是一个指针。
#include<stdio.h>
int *getStuScore(int poi,int (*pstu)[4])
{
int *p;
p = (int *)(pstu + poi);
return p;
}
int main()
{
int score[3][4] = {{47,78,96,95},
{100,22,3,4},
{5,6,7,9}};
int poi;
puts("请输入学生学号(0,1,2)");
scanf("%d",&poi);
int *p;
p = getStuScore(poi,score);
for(int i = 0;i < 4;i++){
printf("%-3d\n",*p++);
if(*p++ < 60){
printf("成绩不及格:");
}
}
return 0;
}
指针函数可以用于动态分配内存,例如:
#include <stdio.h>
#include <stdlib.h>
int *create_array(int n)
{
int *arr = (int *)malloc(n * sizeof(int));
if(!arr)
{
printf("内存分配失败!");
exit(1);
}
for(int i = 0; i < n; ++i)
{
arr[i] = i + 1;
}
return arr;
}
int main()
{
int *arr = create_array(5);
for(int i = 0; i < 5; ++i)
{
printf("%d ", arr[i]);
}
free(arr);
return 0;
}
上述程序中,create_array函数是一个指针函数,它动态分配了一个包含了n个元素的int类型数组,并返回了该数组的起始地址。在main函数中,调用了create_array函数并打印出了数组中的元素。
区别
在C语言中,函数指针和指针函数有以下几个方面的区别:
- 定义方式不同
函数指针定义为 int (*pfun)(int, int)
,指向的是一个函数。
指针函数定义为 int *pfun(int, int)
,返回的是一个指向int类型的指针。
- 使用方式不同
函数指针用于封装回调函数,可以作为参数传递给另外一个函数。
指针函数通常用于动态分配内存,返回指向该类型的指针。
- 调用方式不同
函数指针调用方式为 (*pfun)(a, b)
。
指针函数调用方式为 p = pfun(a, b)
。
总结
通过本篇博客的介绍,我们了解了C语言中函数指针和指针函数的概念、用法、案例以及它们之间的区别。在编写C语言程序时,正确理解和应用这两个概念可以增强代码的可读性,降低程序出错概率,提高程序的健壮性。