共以下 2 个回答

  • Thaddeus 永久会员 2023年8月15日 下午6:43
    1、函数指针

    (1.)定义:本质是一个指针变量,存储一个函数的地址

    (2.)声明: 类型 (*指针名)(参数);,示例如下:

    int add(int x,int y) {
      return x + y;
    }
    
    int main() {
      int (*ptr)(int,int);      //声明 也可以int (*ptr)(int a, int b);
      ptr = add;                //初始化,把一个函数的地址赋值给函数指针 方法一:ptr = add; 方法二:ptr = &add; 函数名就是该函数的函数指针
      cout<<(*ptr)(1, 2)<<endl; //调用函数指针 方法一:ptr(1, 2); 方法二:(*ptr)(1, 2);
      return 0;
    }
    

    (3.)为什么要使用函数指针?

    答:
    用途一:回调函数,函数指针允许我们将一个函数A作为参数传递给另一个函数B,函数B就是回调函数,这样在函数B内部就可以借助函数A来实现某些功能,这样当函数A需要更改的话,我们只需要修改函数指针的指向即可。

    用途二:运行时决定调用的函数,函数指针使我们能够在运行时根据需要选择调用不同的函数。例如排序方式有很多种,但是返回值和参数都是相同的,因此当我们需要调用不同的排序时,只需修改函数指针的指向,然后使用同一个函数指针来调用不同的排序方式就可以了。

    2、指针函数

    (1.)定义:本质是一个函数,其返回值是一个指针

    (2.)声明:类型* 函数名(参数);,示例如下:

    int* getSum(int n) {
      //求和,1~n
      static int sum = 0; 
      int* ret = &sum;  //ret是指向sum的指针
      for(auto i : n) {
        sum += i;
      }
      return ret;
    }
    
    int main() {
      int* ptr = getSum(10); //使用一个整型指针来接收函数返回的指针
      cout<<*ptr<<endl;
      return 0;
    }
    
    

    (3.)使用注意

    • 不要返回在栈区(局部变量)的变量的指针,否则该变量生命周期结束后,指针指向的内容就会失效;

    • 若指针函数返回的是一个指向一块动态分配内存得到的地址,那么接收指针要负责释放内存。

    1 赞同 0 条回复
  • shuaidi 永久会员 2023年8月14日 下午11:45

    1、函数指针

    (1.)定义:本质是一个指针变量,存储一个函数的地址

    (2.)声明: 类型 (* 指针名)(参数);,示例如下:

    int add(int x,int y) {
      return x + y;
    }
    
    int main() {
      int (*ptr)(int,int);      //声明 也可以int (*ptr)(int a, int b);
      ptr = add;                //初始化,把一个函数的地址赋值给函数指针 方法一:ptr = add; 方法二:ptr = &add; 函数名就是该函数的函数指针
      cout<<(*ptr)(1, 2)<<endl; //调用函数指针 方法一:ptr(1, 2); 方法二:(*ptr)(1, 2);
      return 0;
    }
    

    (3.)为什么要使用函数指针?

    答:用途一:回调函数,函数指针允许我们将一个函数A作为参数传递给另一个函数B,函数B就是回调函数,这样在函数B内部就可以借助函数A来实现某些功能,这样当函数A需要更改的话,我们只需要修改函数指针的指向即可。

    用途二:运行时决定调用的函数,函数指针使我们能够在运行时根据需要选择调用不同的函数。例如排序方式有很多种,但是返回值和参数都是相同的,因此当我们需要调用不同的排序时,只需修改函数指针的指向,然后使用同一个函数指针来调用不同的排序方式就可以了。

    2、指针函数

    (1.)定义:本质是一个函数,其返回值是一个指针

    (2.)声明:类型*函数名(参数);,示例如下:

    int* getSum(int n) {
      //求和,1~n
      static int sum = 0; 
      int* ret = &sum;  //ret是指向sum的指针
      for(auto i : n) {
        sum += i;
      }
      return ret;
    }
    
    int main() {
      int* ptr = getSum(10); //使用一个整型指针来接收函数返回的指针
      cout<<*ptr<<endl;
      return 0;
    }
    
    

    (3.)使用注意

    不要返回在栈区(局部变量)的变量的指针,否则该变量生命周期结束后,指针指向的内容就会失效;

    若指针函数返回的是一个指向一块动态分配内存得到的地址,那么接收指针要负责释放内存。

    0 赞同 0 条回复

# 回答此问题

后才能回答