0

我写了一个小程序来概述我的问题。它应该将“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 以使其正常工作?

4

2 回答 2

2

由于您有定义数组维度的常量,因此我建议不要使用自制索引(其他答案中提供的解决方案),因为这是编译器的工作,它会使您的程序更难阅读和维护。只需将printAry声明更改为:

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

至:

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

您也可以包含第一个维度,但编译器会忽略它。编译器需要其他维度,因为ppAry[i][j]被转换为(&ppAry[0][0])[i*NUM_Y + j]

现在,您可以直接调用它,而不是调用printArywith 。ppAryary

于 2013-10-17T09:29:30.757 回答
0

您需要传递数组的起始地址,并通过元素增加地址以获得元素的地址[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");
    }
}
于 2013-10-17T09:03:59.530 回答