DFSstar 2024-12-02 15:15 采纳率: 85.7%
浏览 11
已结题

函数指针类型与函数指针

函数指针类型与函数类型的问题

今天学到了函数指针类型。大概的定义能理解了,就是定义一个类型,这个类型是一个函数指针?可能是吧
然后有下面的代码:

#include <iostream>
using namespace std;
int* get_arr(int a, int b, int c) {
    int* list = new int[a];
    for (int i = 0; i < a; i++) {
        *(list + i) = b + i * c;
    }
    return list;
}
typedef int* (*intarr)(int a, int b, int c);

int main() {
    intarr go = get_arr;
    

    return 0;
}

当然上面的代码自己觉得好玩,定义了一个指针函数,然后定义了一个指向指针函数的函数指针类型。(纯好玩)
我作如下修改:
typedef int* (*intarr)(int a, int b, int c);
这句代码如果换成:
typedef int* intarr(int a, int b, int c);
我的main函数里面的赋值就要变为
intarr *go = get_arr;
指针变成了从新建一个函数类型的指针指向指针函数。
然后有这么一个问题:
从使用上,我大概都能明白了,但是底层内存上,究竟是怎么运作的?哈哈,纯好奇,因为没有侧重学习内存,云里雾里的

  • 写回答

1条回答 默认 最新

  • 码到π退休 Java领域新星创作者 2024-12-03 11:34
    关注

    本答案参考 多次询问 ChatGPT-3.5 后选择的最佳回答,若是满意,还请采纳,谢谢

    1. 函数指针类型与函数指针的概念回顾
      • 在C++中,函数指针是指向函数的指针变量。函数指针类型则是一种自定义类型,用于描述函数指针的类型特征。
      • 例如,在原始代码中typedef int* (*intarr)(int a, int b, int c);,这里intarr被定义为一个函数指针类型,它指向的函数接受三个int类型的参数(abc)并返回一个int*类型(指向int的指针)。
      • 当定义intarr go = get_arr;时,go是一个函数指针,它可以指向任何与intarr类型匹配的函数,这里指向了get_arr函数。
    2. 修改后的类型定义及指针使用变化
      • 当把typedef int* (*intarr)(int a, int b, int c);换成typedef int* intarr(int a, int b, int c);时,intarr的定义发生了本质变化。此时intarr不再是函数指针类型,而是一个函数类型。
      • main函数中的intarr *go = get_arr;,这里go变成了一个指向函数类型intarr的指针。这种变化在语法上反映了不同的类型定义方式,但在底层内存管理方面有不同的表现。
    3. 底层内存运作分析
      • 函数指针(原始定义方式)的内存运作
        • 函数在内存中有其入口地址,对于函数指针go(按照原始定义方式),它存储的是函数get_arr的入口地址。
        • 当调用go(例如int* result = go(5, 1, 2);假设这样调用)时,程序会根据go中存储的地址跳转到get_arr函数的代码段开始执行。
        • 在32位系统中,函数指针通常占用4个字节,在64位系统中通常占用8个字节,用来存储函数的入口地址。
      • 指向函数类型的指针(修改定义后的方式)的内存运作
        • intarr被定义为函数类型时,intarr *go这种指针的含义有所不同。虽然它最终也是指向函数get_arr,但在类型系统中的语义发生了变化。
        • 从内存角度看,它仍然存储函数get_arr的入口地址,但是在编译和类型检查时,编译器会根据intarr是函数类型来进行不同的处理。例如,在进行函数调用时,编译器会根据函数类型的定义来检查参数类型和返回值类型是否匹配。
        • 这种定义方式下的指针在内存中的布局和占用空间与函数指针类似(在32位系统中通常4字节,64位系统中通常8字节),但是在类型相关的操作(如函数重载、类型转换等)方面会有不同的行为。

    总的来说,无论是函数指针还是指向函数类型的指针,在底层内存中都是存储函数的入口地址,但在C++的类型系统中,它们的定义方式不同会导致在编译、类型检查和代码可读性等方面有不同的表现。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月11日
  • 已采纳回答 12月3日
  • 创建了问题 12月2日