50. C++ 指针函数与函数指针

指针函数与函数指针
1. 指针函数

指针函数,是指带指针的函数,即本质是一个函数。函数都有返回类型(如果不返回值,则为无值型void),只不过指针函数返回类型是某一类型的指针。函数返回值必须用同类型的指针变量来接受,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。

定义格式:类型名 *函数名(函数参数列表);

其中,后缀运算符括号"()“表示这是一个函数,其前缀运算符星号”*"表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),"类型名"表示函数返回的指针指向的类型”。

“(函数参数列表)”中的括号为函数调用运算符,在调用语句中,即使函数不带参数,其参数表的一对括号也不能省略。

#include <iostream>
#include <tchar.h>

using namespace std;
int *f(int a, int b); // 声明指针函数  
   
int _tmain(int argc, _TCHAR* argv[])  
{  
     printf("------------------------------ Start\n");  
   
     int *p1 = NULL;  
     printf("The memeory address of p1 = 0x%x \n", p1);  
   
     p1 = f(1, 2);  
   
     printf("The memeory address of p1 = 0x%x \n", p1);  
     printf("*p1 = %d \n", *p1);  
   
     printf("------------------------------ End\n");  
     getchar();  
     return 0;  
}  
  
 /* 
  * 指针函数的定义 
  * 返回值是指针类型int * 
  */  
int *f(int a, int b) {  
     int *p = (int *)malloc(sizeof(int));  
     printf("The memeory address of p = 0x%x \n", p);  
     memset(p, 0, sizeof(int));  
     *p = a + b;  
     printf("*p = %d \n", *p);  
   
     return p;  
}
2. 函数指针

函数指针是指向函数的指针变量。因而“函数指针”本身首先应该是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整形变量、字符型、数组一样,这里是指向函数。函数指针有两个用途:调用函数和做函数的参数。

函数指针的声明格式如下

返回值类型 ( * 指针变量名) ([形参列表]);

注:“返回值类型"说明函数的返回类型,”(指针变量名 )"中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

void (*fptr)(); // 指针名为fptr,指向一个返回值类型为空,不带参数的函数

把函数的地址赋值给函数指针,可以采用下面两种形式:

fptr=&Function;
fptr=Function;    // 取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址

如果是函数调用,还必须包含一个圆括号括起来的参数表。可以采用如下两种方式来通过指针调用函数:

x=(*fptr)();
x=fptr();

第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。

相关推荐

  1. 50. C++ 指针函数函数指针

    2024-02-16 18:02:02       46 阅读
  2. C++ 函数指针回调函数

    2024-02-16 18:02:02       47 阅读
  3. C 函数指针回调函数

    2024-02-16 18:02:02       31 阅读
  4. C++之函数指针

    2024-02-16 18:02:02       68 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-16 18:02:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-16 18:02:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-16 18:02:02       82 阅读
  4. Python语言-面向对象

    2024-02-16 18:02:02       91 阅读

热门阅读

  1. 消息中间件管理系统-RabbitMQ及其两类传输模型

    2024-02-16 18:02:02       48 阅读
  2. c# BlockingCollection 清空

    2024-02-16 18:02:02       52 阅读
  3. 【DDD】学习笔记-实体定义

    2024-02-16 18:02:02       39 阅读
  4. C++ 中的 typedef 和 using

    2024-02-16 18:02:02       49 阅读
  5. RestTemplate自定义设置

    2024-02-16 18:02:02       51 阅读
  6. ES实战--文档间的关系

    2024-02-16 18:02:02       58 阅读