Выделение двумерного массива без использования обозначения массива - PullRequest
0 голосов
/ 08 февраля 2011

Работал над назначением, которое требует создания и обхода двумерного массива целых чисел, но без использования обозначения массива, такого как [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 ]

2 голосов
/ 08 февраля 2011

Почему бы вам просто не объявить простой массив.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]
}
0 голосов
/ 08 февраля 2011
*pElement = element throws a EXC_BAD_ACCESS error

Вам придется сбросить pElement между каждым столбцом, прямо сейчас, он будет продолжаться до 20 шагов после ограничения первого столбца.

Тогда вам нужно быть более осторожным, используяоператор &.Он принимает адрес переменной.Операция [0] принимает первое значение в массиве, эти два значения означают, что: &pRow[0] == pRow => true

И поскольку вы не должны использовать нотацию массива, для этого будет достаточно pRow.1011 * Это также верно семантически, однако, как я уже говорил выше, &var[0] не требуется, в любом случае он будет var.

Кроме того, как примечание стороны, правильно лискажем,

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

обращается к тому же предмету (который является первым элементом) как

int *pElement = &**a[0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...