2d представление массива через указатель - PullRequest
2 голосов
/ 27 сентября 2010

Адреса массивов 1d фактически принимаются за

a[i]=*(a+i);

Адреса двумерных массивов рассчитываются как

a[i][j]=**(a+i+j);

Ответы [ 5 ]

4 голосов
/ 27 сентября 2010

Другие ответы не совсем верны. Это больше похоже на:

*(*(a+i)+j)
2 голосов
/ 27 сентября 2010

Применить правило рекурсивно:

a[i][j] == *(a[i] + j) == *(*(a + i) + j)
0 голосов
/ 27 сентября 2010

Нет. a и a[i] относятся к разным типам (соответственно int** и int*).

Предположим, что в вашем примере a был определен как массив массива int (например, a[10][20]), когда вы передаете его функции (таким образом, преобразовывая ее в pointer to the first element of the array), у вас есть (с дальнейшими "упрощениями") за 2-й ранг массива)

    a           is of type `int**`
    a[i]        is of type `int*`
    a[i][j]     is of type `int`

    *(a+i)      is of type `int*`
    a+i+j       is of type `int**`
    *(a+i+j)    is of type `int*`
    *(*(a+i)+j) is of type `int`
0 голосов
/ 27 сентября 2010
// CTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

void print (int i, int j )
{
    int a[3][3] = {
        { 1,2,3 },
        { 4,5,6 },
        { 7,8,9 }
        };
    printf ("%d\n", *(*(a+i)+j) );
    printf ("%d\n", a[i][j] );
}

int _tmain(int argc, _TCHAR* argv[])
{

    print (0,0);
    print (1,1);
    print (2,2);
    return 0;
}

Возвращает:

1 1 5 5 9 9

* Это было выполнено через компилятор ....

0 голосов
/ 27 сентября 2010

Нет, потому что тогда a[1][2] и a[2][1] были бы в одном месте. Что-то вроде *(a+i*n+j) для массива n-by-m ближе к метке (хотя будьте осторожны, я набираю точное выражение в редакторе уценки, а не в модульном тесте).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...