指针函数 函数的指针

                指针函数与函数的指针

  指针函数

函数不但可以返回数值型数据而且还可以返回指针值,能够返回指针值的函数叫指针函数。

指针函数定义格式如下:

      

类型标识符 *函数名(形参表)

           函数体

 

1)定义指针函数时,函数名前必须有*

2)返回的是一个指针值,而不是一个数值型数据。

该函数是截去参数字符串的尾部空格,并以字符指针的形式返回该字符串。 1 #include <string.h>

2 #include <stdio.h>

3 char *trim(char *s)

4 {

5       char *p=s+strlen(s)-1;

6     while(p-s>=0&&*p==' ')

             p--;

8     *(p+1)='/0';

9     return s;

10 }

11 void main()

12 {

13    char str[]="china    ";

14    char *cp=str;

15    printf("%s/n",trim(cp));

16 } 

注意,指针函数所返回的指针不能是函数返回后即不存在的对象,如函数中的自动变量,形参变量等。例如:下面的函数试图返回一个指向两个参数中较大者的指针:  int * fun(int a,int b)

 {

     if(a>b)

        return  &a;

     return  &b;

 }

此函数不能得到预期的结果,其原因是,ab都是形参变量,其生存期只延续到fun运行结束,因此调用fun所获得的结果是不可靠的。

  函数指针

指针可以指向变量,可以指向数组也可以指向函数,指向函数的指针称为函数指针。

我们知道,程序在运算时,组成程序的函数是存储在内存的代码区中的,显然要找到执行的函数必须找到函数的入口地址,这个入口地址就叫做函数的指针。C语言函数名在程序运行时就指示了这个入口地址,也就是说函数名实质上也是地址,因此我们可以用一个指针变量来指向这个地址,即指向函数的入口地址。我们把这个指向函数入口地址的指针叫做函数指针,然后通过函数指针来调用指向的函数。

函数指针定义如下:

 

类型标识符 (*函数名)(形参表)

            

实际上指针变量名就相当于函数名了。

函数指针变量的使用

1 #include <stdio.h>

2 int max(int ,int);  /*函数声明*/

3 void main()

4 {

5       int (*pmax)(int ,int);  /*定义函数指针变量*/

6     int i=50,j=100;

7     pmax=max;//函数名代表函数入口地址,将入口地址送给函数指针

8     printf("%d/n",(*pmax)(i,j));//注意函数调用方式

9 }

10 int max(int x,int y)

11 {

12     return (x>y)?x:y;

13 }

关于函数指针变量的几点说明:

1)函数指针变量是有类型的,如上例中的第5行,函数指针变量能够接收的函数指针必须具有两个整型形参,而且返回值必须为整型。这样就相当于给定了函数的原型,以便进行严格的语法检查,另外此处只是定义函数指针变量,不是定义函数,因此不能有函数体。

2)第7pmax=max完成对函数指针变量的赋值,使用的函数指针来自于与pmax所需原型一致的函数max,赋值的方法是使用不带参数的函数名。

3)第8行通过函数指针变量pmax调用了函数max,其中的(*pmax)相当于函数名max,该处也可以直接使用pmax函数指针变量作为函数名,调用形式也可以改为pmax(i,j)

4)一般指针的运算,如p+np++p--等对函数指针不起作用。即函数指针不能用于计算。

5)函数指针变量的优点是提供了一种将函数作为形参的机制。

设计一个函数process,可以完成对数进行多种处理

1 #include "stdio.h"

2 double process(double (* f)(double,double))

3 {

4       int i;

5       double result=1;

         6    for(i=2;i<=10;i++)

7           result=f(result,i);

8       return result;

9 }

10 int main()

11 {

12       double add(double,double);

13       double mul(double,double);

14       double rev(double,double);

15     printf("%.0f/n",process(add));

16     printf("%.0f/n",process(mul));

17     printf("%f/n",process(rev));

18    return 0;

19 }

20 double add(double x,double y)

21 {

22       return x+y;

23 }

24 double mul(double x,double y)

25 {

26       return x*y;

27 }

28 double rev(double x,double y)

29 {

30       return x+1/y;

31 }

程序运行结果:

55

3628800

    2928968

 
指针函数函数指针是C/C++中个容易混淆的概念,它们的核心区别在于本质不同,并且在实际编程中有着不同的用途和使用方法。 ### 指针函数 指针函数本质上是一个**函数**,其返回值类型是指针类型。这意味着该函数执行后将返回一个地址值,通常用于从函数中返回动态分配的内存地址或结构体数组的地址等。例如: ```c int* createArray(int size) { int* arr = new int[size]; // 在堆上分配内存 for (int i = 0; i < size; ++i) { arr[i] = i * i; } return arr; } ``` 在这个例子中,`createArray` 是一个指针函数,它返回一个指向整数数组的指针。需要注意的是,不要返回局部变量指针,因为局部变量的作用域仅限于函数内部,一旦函数返回,这些变量所占用的内存就会被释放[^4]。 ### 函数指针 函数指针则是一个**指针变量**,它指向的是一个函数的入口地址。通过函数指针,可以实现对函数的间接调用,这在实现回调机制、策略模式等方面非常有用。声明和使用函数指针的方式如下: ```c // 声明一个函数指针类型 typedef int (*FuncPtr)(int, int); // 定义个简单的数学运算函数 int add(int a, int b) { return a + b; } int subtract(int a, int b) { return a - b; } // 使用函数指针 void useFunction(FuncPtr fp, int x, int y) { int result = fp(x, y); // 通过函数指针调用函数 printf("Result: %d\n", result); } ``` 这里,`FuncPtr` 是一个指向接受个整数参数并返回一个整数的函数指针类型。`useFunction` 函数接受一个这样的函数指针以及个整数作为参数,并通过这个指针来调用相应的函数[^3]。 ### 核心区别 - **本质不同**:指针函数是返回值为指针类型的函数;而函数指针指向某个函数指针变量。 - **声明语法**:指针函数的声明如 `int* func(int a, int b);`,其中 `*` 靠近返回值类型;而函数指针的声明如 `int (*func)(int a, int b);`,其中 `*` 与函数名结合。 - **应用场景**:指针函数常用于动态内存分配、返回数组/结构体指针等;而函数指针则适用于回调函数、策略模式、动态函数调用等场景。 理解这者的区别及其正确使用方法对于掌握C/C++编程至关重要,尤其是在进行系统级编程、开发高性能应用或库时。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值