函数指针与指针函数分析,自己绝对可以搞定!

         自己最近将C语言中的几个难点一一攻克了,以前不是特别在意,真正看的时候也是感觉特别烦,总是一拖再拖,现在已经不是那个时候了,需要一一把它彻底搞明白,这次是函数指针与指针函数的分析,自己的理解,可能不是特别科学,但是真正自己理解了它们之间的区别,供大家参考。

指针函数:

定义:返回值是一个指针的函数。

int * ptr_fun(int a, int b);

指针函数的本质是一个函数,它与一般的函数的区别就是它的返回值是一个指针。

举一个例子:

函数定义:

int * prt_fun(int a,int b)

{

    int c  = 0;

   stctic  c = a + b;

  printf("&c = %p\n", &c);

   return &c;

}

该函数返回的是c的地址.

调用:

int * p = NULL;

p = prt_fun(3,4);

printf("p = %p\n",p);

因为其返回值是一个地址,所以需要一个指针变量来接收,现在p的地址和c的地址应该是一样的,下面的源码输出的结果进行了验证:

#include<stdio.h>


int * prt_fun(int a,int b);

int main(int argc, const char * argv[])
{

int * p = prt_fun(3,4);

printf("p = %p\n",p);

return 0;
}

int * prt_fun(int a,int b)

{

static int c = 0;

c = a + b;

printf("&c = %p\n", &c);

return &c;

}

 

结果:

两个地址确实是一样的,在这个例子中,我又发现自己的内存四区的理解也使用上了,因为函数是在栈区的,所以在函数执行完毕后,对应的空间将会释放,所以需要将c的地址存放在常量区才是安全的,所以加上几个关键字static,就可以使c的生命周期变为整个程序存在过程,试着将static去掉,发现会出现如下的警告和不是预期的结果,出现这种现象的根源就是没有使用static,此时的c是放在了栈区。

 

 

函数指针:

定义:指向函数的指针。

int * (p)(int a, int b);

函数指针的本质是一个指针,它与一般的指针的区别就是它是一个指向函数指针,本质上函数名就是一个指针。

 int (*p)(int a,int b); 

//定义了一个函数指针,指针的名字是p

    int b = 2;
    p = add;

//将指针指向了函数
    printf("%d\n",add(a,b));
    printf("%d\n",p(a,b));

源码:

/*函数指针*/
#include <stdio.h>
int add(int a,int b)
{
	return a+b;
}

int main(int argc, const char *argv[])
{
	int (*p)(int a,int b);
	int a = 1;
	int b = 2;
	p = add;
	
	printf("%d\n",add(a,b));
	
	printf("%d\n",p(a,b));
	return 0;
}

以上就是函数指针与指针函数的区别,可以完美地理解了!

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(void)
{
	//函数指针,它是指针,指向函数的指针
	//定义函数指针变量有3种方式
	//1、先定义函数类型,根据类型定义指针变量(不常用)
	//有typedef是类型,没有是变量
	typedef int FUN(int a); //FUN函数类型
	FUN *p1 = NULL; //函数指针变量
	//p1 = &fun;
	p1 = fun; //p1 指向 fun函数
	fun(5); //传统调用
	p1(6); //函数指针变量调用方式

	//2、先定义函数指针类型,根据类型定义指针变量(常用)
	typedef int(*PFUN)(int a); //PFUN, 函数指针类型
	PFUN p2 = fun; //p2 指向 fun
	p2(7);

	//3、直接定义函数指针(常用)
	int(*p3)(int a) = fun;
	p3(8);

	int(*p4)(int a);
	p4 = fun;
	p4(9);


	return 0;
}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值