指向C ++中的函数指针

时间:2016-01-24 09:24:30

标签: 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()指向哪个地址?它在内存中的位置?

2 个答案:

答案 0 :(得分:4)

与使用数组的名称类似,使用函数名称会使它在最轻微的挑衅时衰变为指针。

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是指向函数的指针,并显示存储在指针中的地址。

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

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

答案 1 :(得分:1)

问题在于你基本上不能对"函数对象做任何事情" ... C ++只管理"指向函数的指针"。

因此,函数将隐式地衰减为指向函数的指针以供任何使用...它与你放在它前面的*的数量并不重要。

类似的事情发生在数组中,它们隐式地衰变成指向第一个元素的指针,不同之处在于你可以对数组执行某些操作(例如sizeof),而这甚至禁止使用函数。

鉴于在C ++中没有(可移植)方式在运行时创建新函数,不能操作函数对象的限制并不重要。你只能处理指向现有函数的指针......