我写了一个小程序来概述我的问题。它应该将“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以使其工作?
答案 0 :(得分:2)
由于你有定义数组维度的常量,我建议不要使用自制索引(在其他答案中提供的解决方案),因为这是编译器的工作,它使你的程序更难以阅读和维护。只需更改printAry
声明:
void printAry(int *ppAry[]) { ... }
要:
void printAry(int ppAry[][NUM_Y]) { ... }
您也可以包含第一个维度,但编译器会忽略它。编译器需要其他维度,因为ppAry[i][j]
已转换为(&ppAry[0][0])[i*NUM_Y + j]
现在,您可以直接使用printAry
调用ppAry
,而不是使用ary
来调用{{1}}。
答案 1 :(得分: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");
}
}