Как я могу перебрать 2-мерный массив с помощью указателей? - PullRequest
0 голосов
/ 29 апреля 2011

У меня матрица 20х20.Я хочу извлечь куски данных из матрицы.У меня есть

int theMatrix[20][20] = {};//Full code initializes with #'s
int *theMatrixPointer = &theMatrix;

Но затем я получаю предупреждение компилятора, говорящее

предупреждение: инициализация из несовместимого типа указателя

Я продолжил работукод и, похоже, движется по матрице слева направо.По крайней мере, в краткосрочной перспективе.Реализация:

//left to right with pointer;
while(theMatrixPointer)
{
    int one = 0;
    int two = 0;
    int three = 0;
    int four = 0;
    double currentProduct = 0;
    //int stop = 0;
    for(int i = 0; i < depth; i++)
    {
        /*if(!theMatrixPointer)
        {
            stop = 1;
            break;
        }*/
        int currentValue = *theMatrixPointer++;
        printf("%d\n",currentValue);
        if(i == 0)
        {
            one = currentValue;
        }
        else if (i == 1)
        {
            two = currentValue;
        }
        else if (i == 2)
        {
            three = currentValue;
        }
        else if (i == 3)
        {
            four = currentValue;
        }
    }
    /*if(stop)
        break;*/
    currentProduct = one * (double)two * three * four;
    printf("PRODUCT: %f\n",currentProduct);
    startPoint++;
    theMatrixPointer = startPoint;
}

... со временем разрывается, поскольку данные являются мусором (большие целые числа, которых нет в матрице).Итак, как я могу правильно перебрать эту матрицу с указателем?

Ответы [ 2 ]

1 голос
/ 29 апреля 2011

Проверьте мой ответ на подобный вопрос здесь . По сути, я думаю, что работа с Matrix [20 * 20] является более разумным подходом по умолчанию, чем работа с Matrix [20] [20].

1 голос
/ 29 апреля 2011

Во-первых, вы получаете предупреждение, потому что &theMatrix имеет тип int(*)[20][20], тогда как theMatrixPointer имеет тип int *. Вы хотите это:

int *theMatrixPointer = &theMatrix[0][0];

Во-вторых, причина, по которой вы получаете мусор, заключается в том, что вы пересекаете конец массива. while (theMatrixPointer) будет повторяться до theMatrixPointer == 0. Но помните, что theMatrixPointer это адрес . Это не будет 0, пока вы не выполните итерацию по всему адресному пространству и не обернетесь вокруг него!

Возможно, вам лучше всего это сделать:

int i, j;
for (i = 0; i < 20; i++)
{
    for (j = 0; j < 20; j++)
    {
        // matrixPointer[i][j] is the current element
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...