不使用数组表示法分配2D数组

时间:2011-02-08 10:03:02

标签: c++ arrays pointers 2d

正在进行一项需要创建和遍历二维整数数组但不使用数组表示法的赋值,例如[1] [2]甚至(a + i)+ j )。需要使用指针算法来访问每个单独的元素。

到目前为止,我的方法是分配它。其中包含显示我认为我的代码应该完成的内容的评论,请随时更正我。

int **a;  // 2d array, or pointer to array of pointers
row = 5;     
count = 5;

// allocate space
a = new int* [row];   // create array of pointers
int *p = *m;          // point to first array
for (int r = 0; r < row; r++)
{
    a = new int [col];  // create space within each array
    a++;
}

行和列是动态的,并作为函数中的参数传入。这里仅以5为例。

要使用元素填充5 x 5 2d数组(示例5),我使用以下内容:

int *pRow = *a;            // get array of pointers
int *pElement = &pRow[0];  // get first element from the first array
int r = 0;
int c = 0;

while (r < row)
{
    while (c < col)
    {
        int element = 5;    
        *pElement = element;  // set first element to 5
        pElement++;           // go to next element
        c++;                  
    }
    c = 0;
    r++;
}

问题是* pElement = element会抛出一个EXC_BAD_ACCESS错误,因此出现了我做错的事情。

任何人都可以指出我的错误或纠正我对指针的理解,如果发现它需要吗?

-

另外,作为旁注,说的是正确的,

int *pRow = *a; 
int *pElement = &pRow[0];

的形式访问同一个东西(第一个元素)
int *pElement = &**a[0];

2 个答案:

答案 0 :(得分:2)

为什么不直接声明一个简单的数组。 2D阵列可以变平为1d。这将大大简化算术。

int* a = new int[row * column];

for (int iRow = 0; iRow < (row - 1); ++iRow)
    for (int jCol = 0; jCol < (column - 1) ; ++jCol)
{
// here you can access a[iRow * row + jCol]
}

答案 1 :(得分:0)

*pElement = element throws a EXC_BAD_ACCESS error

您必须在每列之间重置pElement,现在,它将在第一列的限制之后继续最多20步。

然后你必须更加小心使用&运算符。它采用变量的地址。 [0]操作采用数组中的第一个值,这两个意味着:&pRow[0] == pRow => true

由于你不应该使用数组表示法,pRow就足够了。

这在语义上也是如此,但正如我上面所述,不需要&var[0],无论如何它都会评估为var

另外,作为旁注,说的是正确的,

int *pRow = *a; 
int *pElement = &pRow[0];

的形式访问同一个东西(第一个元素)
int *pElement = &**a[0];