C++中,函数指针和指针函数是两个容易混淆的概念,但它们有着显著的区别。它们在很多场景下都有广泛的应用。函数指针常用于实现回调函数、函数表等场景,而指针函数则用于返回复杂数据结构的指针。理解并掌握这两个概念,有助于编写更加灵活和高效的C++代码。本文主要介绍函数指针和指针函数用法及区别。

1、指针函数

指针函数,简单理解就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。声明格式如下:

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

例如,

int *myfun(int x,int y);

注意:在函数名前面多了一个*号,而这个函数就是一个指针函数。其返回值是一个 int 类型的指针。

指针函数的写法可以有以下几种:

int *fun(int x,int y);
int * fun(int x,int y);
int* fun(int x,int y);

*靠近返回值类型的写法更容易理解。

指针函数使用示例如下,

#include <iostream>
using namespace std;
#include<string.h>

int *newAdd(int a, int b); // 声明指针函数

int main() {
  int *p1 = NULL;
  p1 = newAdd(1, 2);
  printf("p1 = 0x%x \n", p1);
  printf("*p1 = %d \n", *p1);
  getchar();
  return 0;  
}
int *newAdd(int a, int b) {
  int *p = (int *)malloc(sizeof(int));
  memset(p, 0, sizeof(int));
  printf("函数内:p = 0x%x \n", p);
  *p = a + b;
  printf("函数内:*p = %d \n", *p);
  return p;
}

注意:在调用指针函数时,需要一个同类型的指针来接收其函数的返回值。

也可以将其返回值定义为 void*类型,调用时强制转换返回值为想要的类型。

2、函数指针

函数指针,其本质是一个指针变量,该指针指向这个函数。函数指针就是指向函数的指针。声明格式如下:

类型说明符 (*函数名) (参数)

例如,

int (*myfun)(int x,int y);

把一个函数的地址赋值给函数指针变量有两种写法:

myfun = &Function;

myfun = Function;

注意&不是必需的,因为一个函数标识符就表示了它的地址。

调用函数指针的方式也有两种:

x = (*myfun)(); 

x = myfun();

函数指针使用示例如下,

#include <iostream>
using namespace std;
int add(int x,int y){
    return x+y;
}
int sub(int x,int y){
    return x-y;
}
//函数指针
int (*myfun)(int x,int y);
int main(int argc, char *argv[])
{
    //第一种写法
    myfun = add;
    cout << "(*myfun)(1,2) =  " <<  (*myfun)(1,2) << endl;
   //第二种写法
    myfun = &sub;
    cout << "(*myfun)(5,3) = " <<  myfun(5,3) << endl;
    return 0;
}

3、函数指针和指针函数的区别

函数指针是指向函数的指针,存储的是函数的地址,用于间接调用函数。指针函数是一个返回指针的函数,它的返回值是一个指针。

特性函数指针指针函数
本质是一个指向函数的指针变量是一个返回指针的函数
定义int (*myfun)(int x,int y);
int *myfun(int x,int y);
用途用来存储函数地址,
可以通过它调用函数
用来返回一个指针
返回没有直接返回值,
它本身指向一个函数
返回一个指针
调用funcPtr(参数列表)函数名(参数列表)
返回一个指针
使用在回调机制中广泛使用用于返回
动态分配的内存地址等

1)定义不同

指针函数本质是一个函数,其返回值为指针。

函数指针本质是一个指针,其指向一个函数。

2)写法不同

指针函数int* fun(int x,int y);

函数指针int (*fun)(int x,int y);

函数名带括号的就是函数指针,否则就是指针函数。

3)用法不同

一个是函数,一个是变量。

#include <iostream>
using namespace std;

// 普通函数
int multiply(int a, int b) {
    return a * b;
}

// 指针函数,返回一个指向函数的指针
int (*getFunctionPointer())(int, int) {
    return multiply;
}

int main() {
    // 函数指针
    int (*funcPtr)(int, int) = multiply;
    cout << "Using function pointer: " << funcPtr(3, 4) << endl;

    // 调用指针函数,获取一个函数指针
    int (*retrievedPtr)(int, int) = getFunctionPointer();
    cout << "Using pointer function: " << retrievedPtr(5, 6) << endl;

    return 0;
}

推荐文档

相关文档

大家感兴趣的内容

随机列表