C++中指向函数指针的指针
Pointer to function pointer in C++
我写了一些代码来了解函数指针是如何工作的。
我运行下面的C++代码在一些IDE上,结果都是一样的。
#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;
}
我的问题:
- 为什么
s.pt_1 == s.pt_2 == *s.pt_1 = **s.pt_1
?
s.pt_1()
指向哪里?它在内存中的什么位置?
问题是你基本上不能用 "function object" 做任何事情... C++ 只管理 "pointers to function".
因此,函数将隐式衰减为指向该函数的指针以供任何使用...无论您在它前面放多少 *
。
数组也会发生类似的情况,它们隐式地衰减为指向第一个元素的指针,不同之处在于您可以对数组进行一些操作(例如 sizeof
),而函数甚至禁止这样做。
鉴于在 C++ 中没有(可移植的)方法在运行时创建新函数,不能操作函数对象的限制并不重要。无论如何你只能处理指向现有函数的指针...
类似于使用数组的名称,使用函数的名称会使其在最轻微的挑衅下衰减为指针。
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++代码在一些IDE上,结果都是一样的。
#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;
}
我的问题:
- 为什么
s.pt_1 == s.pt_2 == *s.pt_1 = **s.pt_1
?
- 为什么
s.pt_1()
指向哪里?它在内存中的什么位置?
问题是你基本上不能用 "function object" 做任何事情... C++ 只管理 "pointers to function".
因此,函数将隐式衰减为指向该函数的指针以供任何使用...无论您在它前面放多少 *
。
数组也会发生类似的情况,它们隐式地衰减为指向第一个元素的指针,不同之处在于您可以对数组进行一些操作(例如 sizeof
),而函数甚至禁止这样做。
鉴于在 C++ 中没有(可移植的)方法在运行时创建新函数,不能操作函数对象的限制并不重要。无论如何你只能处理指向现有函数的指针...
类似于使用数组的名称,使用函数的名称会使其在最轻微的挑衅下衰减为指针。
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
是一个函数的指针,显示指针存放的地址。
在第二行,您取消引用指针并访问函数本身。当传递给函数时,它会衰减为指针。
在第三行,您取消引用指针以获取函数,然后当您将它与另一个 *
一起使用时,它会衰减为一个指针。第二颗星产生的值在传递给函数时再次衰减为指针。等等