自己最近将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;
}