Как передать ссылку на 2D-массив в C/C++?

Я написал небольшую программу, чтобы обрисовать в общих чертах мою проблему. Он должен вывести значения «ary» на экран. Если я использую «ary» напрямую, нет проблем. Но я хочу получить доступ к "ary" по ссылке:

#include <stdio.h>
#include <stdlib.h>

#define NUM_X (4)
#define NUM_Y (4)

int ary[NUM_X][NUM_Y] =
{
    {11, 12, 13, 14},
    {21, 22, 23, 24},
    {31, 32, 33, 34},
    {41, 42, 43, 44},
};

void printAry(int *ppAry[])
{
    int i, j;
    for(i = 0; i < NUM_X; ++i)
    {
        for(j = 0; j < NUM_Y; ++j)
            //printf("%d\t", ary[i][j]);
            printf("%d\t", ppAry[i][j]);

        printf("\n");
    }
}

int main()
{
    int **ppAry = &(ary[0][0]);

    printAry(ppAry);

    return 0;
}

Если вы запустите приведенную выше программу, вы получите ошибку времени выполнения, потому что ppAry, я думаю, не является правильной ссылкой. Как мне изменить ppAry, чтобы это работало?


person AudioDroid    schedule 17.10.2013    source источник
comment
См. этот ответ, чтобы понять, почему то, что вы сделали, неправильно и что следует делать вместо этого.   -  person Shahbaz    schedule 17.10.2013


Ответы (2)


Поскольку у вас есть константы, определяющие размеры массива, я бы посоветовал не использовать самодельную индексацию (решение, представленное в других ответах), потому что это работа компилятора, и это затрудняет чтение и обслуживание вашей программы. Просто измените объявление printAry с:

void printAry(int *ppAry[]) { ... }

To:

void printAry(int ppAry[][NUM_Y]) { ... }

Вы также можете включить первое измерение, но компилятор его проигнорирует. Компилятору нужны другие измерения, потому что ppAry[i][j] преобразуется в (&ppAry[0][0])[i*NUM_Y + j].

Теперь вместо того, чтобы вызывать printAry с помощью ppAry, вы можете напрямую вызывать его с помощью ary.

person Filipe Gonçalves    schedule 17.10.2013

Вам нужно передать адрес начала массива и увеличить адрес через элементы, чтобы получить адрес элемента [i, j]; затем вы можете распечатать значение в этом месте.

void printAry(int *ppAry)
{
    int i, j;
    for(i = 0; i < NUM_X; i++)
    {
        for(j = 0; j < NUM_Y; j++)
            printf("%d\t", ppAry[i * NUM_Y + j]);

        printf("\n");
    }
}
person Thanushan    schedule 17.10.2013