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

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

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

猜你喜欢

转载自blog.csdn.net/zxy131072/article/details/84201653
今日推荐