我的代码:
.h
档案:
extern const int* g_position;
inline DWORD pos_x(BYTE v) {
if (1 <= v && v <= 3)
return g_position[v][0];
return 0;
}
inline DWORD pos_y(BYTE v) {
if (1 <= v && v <= 3)
return g_position[v][1];
return 0;
}
.cpp
档案:
const int* g_position = (int*) 0x86b2fdc;
我要做的是解决基本上是二维数组的函数:
(DWORD (*)[4][2]) 0x86b2fdc<g_position>
出于某种原因,我在编译时遇到以下错误:
In function 'gev::DWORD pos_y(BYTE)':
error: invalid types 'const int[int]' for array subscript
return g_position[v][0];
我的代码有什么问题?我将g_position
声明为数组类型,因此它应该可以工作。
答案 0 :(得分:1)
g_position
被声明为int*
,它只允许一个级别的解除引用,但您尝试执行两个解除引用。您需要将声明更改为int**
:
extern const int** g_position;
const int** g_position = (int**) 0x86b2fdc;
<强>更新强>:
int**
与int[][]
并不完全相同。但是,如果您考虑到int[4][2]
与int[8]
具有相同的内存布局,并且您可以使用int[]
访问int*
的内容,请尝试相反:
extern const int* g_position;
inline DWORD pos_x(BYTE v)
{
if (1 <= v && v <= 3)
return g_position[(v*4)+0];
return 0;
}
inline DWORD pos_y(BYTE v)
{
if (1 <= v && v <= 3)
return g_position[(v*4)+1];
return 0;
}
const int* g_position = (int*) 0x86b2fdc;
答案 1 :(得分:0)
0x86b2fdc
是数组数组的地址吗?或者数组指针数组的地址?或者它是指向某事物的指针的地址?
假设它是4个int的数组数组的地址,您可以将g_position
声明为指向这样的指针:
extern const int (*g_position)[4]; /* pointer to arrays of 4 ints */
<。>在.cpp文件中:
const int (*g_position)[4] = (int (*)[4])0x86b2fdc;
您的基本混淆似乎是混淆指针和数组,这不是一回事:
数组是在内存中一个接一个地排列的对象序列。你不能对数组做任何事情,除了初始化它,获取它的大小,并获得指向它或其第0个元素的指针
指针是指内存的地址。指向的内存可能包含相应类型的单个对象,或者它可能包含一个数组(在这种情况下,指针指向数组的第0个元素。
每当你引用一个数组时(除了使用sizeof或unary&amp;)时,编译器会静默地为你提供一个指向数组第0个元素的指针,所以这个指针的名字大多可以与你的名字互换。阵列。您的pos_
函数未在sizeof
上使用&
或g_position
,因此出于您的目的,它们可以互换。你只需要正确的类型。