寻址函数时数组下标的无效类型

时间:2014-08-06 01:39:24

标签: c++ arrays memory-address

我的代码:

.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声明为数组类型,因此它应该可以工作。

2 个答案:

答案 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,因此出于您的目的,它们可以互换。你只需要正确的类型。