C语言:函数指针与指针函数

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语言中,函数指针和指针函数有以下几个方面的区别:

  1. 定义方式不同

函数指针定义为 int (*pfun)(int, int),指向的是一个函数。

指针函数定义为 int *pfun(int, int),返回的是一个指向int类型的指针。

  1. 使用方式不同

函数指针用于封装回调函数,可以作为参数传递给另外一个函数。

指针函数通常用于动态分配内存,返回指向该类型的指针。

  1. 调用方式不同

函数指针调用方式为 (*pfun)(a, b)

指针函数调用方式为 p = pfun(a, b)

总结

通过本篇博客的介绍,我们了解了C语言中函数指针和指针函数的概念、用法、案例以及它们之间的区别。在编写C语言程序时,正确理解和应用这两个概念可以增强代码的可读性,降低程序出错概率,提高程序的健壮性。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值