如何在C中打印2D数组,而不使用运算符[]?

Isa*_*kin 4 c arrays pointers syntax-error

我正在尝试使用打印2D矩阵[],而不是*像指针一样使用.
因此,对于1 D阵列,我会这样做:*(arr+i)例如.用于替换的语法是matrix[][]什么?

这是代码:

for (i = 0; i < size; i++)
{
    for (j = 0; j < (size * 2); j++)
    {
        printf(" %5d", matrix[i][j]);
    }
    printf("\n");
}
Run Code Online (Sandbox Code Playgroud)

PS,我确实尝试了几件事:

*(matrix+i+j);
*(matrix+i)+*(matrix+j);
Run Code Online (Sandbox Code Playgroud)

当然没有一个有效.

谢谢你的帮助和时间!

Zby*_*000 5

使用*两次.每个*基本上将取代一个[]:

*(*(matrix+i)+j)
Run Code Online (Sandbox Code Playgroud)

  • @ user694733为什么数组会在这里衰减指针?(_if以前没有声明指针_). (2认同)
  • N1570章6.5.2.1有下标数组的例子`int x [3] [5];`带句子:*"......在表达式`x [i]`中,相当于`(*((x) +(i)))`,```首先被转换为指向五个整数的初始数组的指针...."* (2认同)

Pau*_*vie 0

这可能取决于如何matrix分配或传递给函数。

int A[10][15];
Run Code Online (Sandbox Code Playgroud)

这使用了连续的内存块。要在不使用数组表示法的情况下寻址元素,请使用:

        A +(i*15)+j    // user694733 showed this is wrong
((int *)A)+(i*15)+j    // this is horribly ugly but is correct
Run Code Online (Sandbox Code Playgroud)

请注意 15,因为每行由 15 个元素组成。这里的其他答案中提出了更好的解决方案。

在下面的:

int *A[10];
Run Code Online (Sandbox Code Playgroud)

A是一个由 10 个整数指针组成的数组。假设已使用 分配每个数组元素malloc,则无需使用数组表示法即可对元素进行寻址,如下所示:

*(A+i) + j;
Run Code Online (Sandbox Code Playgroud)

也就是说,您采用A,然后采用i第 th 个元素,取消引用该元素并添加j为第二个索引。

- 编辑 -

并且要完整:

int foo(int *p)
Run Code Online (Sandbox Code Playgroud)

这里的函数只接收指向零个或多个整数的指针。该指针指向一个连续的线性内存块,您可以在其中放置一个 n 维数组。有多少个维度以及每个维度的上限函数只能通过参数或全局变量知道。

为了对 n 维数组的单元进行寻址,程序员必须使用上述符号自己计算地址。

int foo3(int *m, int dim2, int dim3, int i,  int j, int k)
{
    int *cell = m + i*dim3*dim2 + j*dim2 + k;
    return *cell;
}
Run Code Online (Sandbox Code Playgroud)

  • 也许它*在内部*这样做。但如果你手动执行,那么类型都是错误的,除非你添加强制转换。对于变量 `int m[2][2];` 使用语法 `m+(i*size)+j` 访问最后一个元素 `m[1][1]`,现在是 `m+(1*2)+1`,将扩展为 `(char*)&amp;m[0] + sizeof(int[2]) * ((1*2)+1)`,这是**超出数组范围**。[Ideone 示例](http://ideone.com/47IdI7)。 (2认同)