c++ - C++中指向函数指针的指针

标签 c++ memory function-pointers

我写了一些代码来了解函数指针是如何工作的。 我在一些IDE上运行下面的C++代码,结果是一样的。

#include "stdafx.h"

int *function(){
    static int a=1;
    return &a;
}
typedef struct{
    int *(*pt_1)();
    int *(*pt_2)();
}x_t;
int _tmain(int argc, _TCHAR* argv[])
{
    x_t s;
    s.pt_1 = function;
    s.pt_2 = &function;

    printf("%x\n",s.pt_1);    //Result: 0x013011a9
    printf("%x\n",*s.pt_1);   //Result: 0x013011a9 
    printf("%x\n",**s.pt_1);  //Result: 0x013011a9
    printf("%x\n",s.pt_1());  //Result: 0x01307000
    printf("%x\n",*s.pt_1()); //Result: 1

    printf("%x\n",s.pt_2);    //Result: 0x013011a9
    printf("%x\n",*s.pt_2);   //Result: 0x013011a9
    printf("%x\n",**s.pt_2);  //Result: 0x013011a9
    printf("%x\n",s.pt_2());  //Result: 0x01307000
    printf("%x\n",*s.pt_2()); //Result: 1

    return 0;
}

我的问题:

    1. 为什么s.pt_1 == s.pt_2 == *s.pt_1 = **s.pt_1
    1. s.pt_1() 指向哪里的地址?它位于内存的什么位置?

最佳答案

与使用数组名类似,使用函数名,稍有挑衅就会衰减为指针。

s.pt_1 = function;    

这里 function 衰减成一个指向函数的指针。

s.pt_2 = &function;

这里你实际上获取了函数的地址,这导致与第一种情况相同的指针。

printf("%x\n",s.pt_1);    //Result: 0x013011a9
printf("%x\n",*s.pt_1);   //Result: 0x013011a9 
printf("%x\n",**s.pt_1);  //Result: 0x013011a9

第一行pt_1是一个指向函数的指针,显示指针中存储的地址。

在第二行,您取消引用指针并访问函数本身。当传递给函数时,它会衰减为指针。

在第三行,您取消引用指针以获取函数,然后当您将它与另一个 * 一起使用时,它会衰减为指针。第二颗星产生的值在传递给函数时再次衰减为指针。等等。

关于c++ - C++中指向函数指针的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34974085/

相关文章:

c++ - 图的两条边之间的角度

java - 即使对于高堆大小分配,Jmeter 也会测试内存不足错误

Java 集合。创建排序 View 而不创建副本

c++ - 指向函数成员的指针

c++ - 如何获取指向 std::get<0,tuple<int,int>> 的指针?

c++ - 如何使用 fstream fstream::app 标志附加到文件似乎不起作用

c++ - 如何对 unique_ptr 列表进行排序?

c++ - Clang AST用于模板类的模板方法

java - 我的 Android 游戏在关闭和打开几次后内存不足

c++ - 简单的模板代码可以在 Visual Studio 中编译,但不能使用 LLVM