1

为什么*(multi + row)生成指针地址而不是值?我很困惑,但必须有一个很好的解释,但我仍然不知道。

#include <stdio.h>
#define ROWS 5
#define COLS 10
int multi[ROWS][COLS];
int main(void)
{
    int row, col;
    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            multi[row][col] = row*col;
        }

    }
    for (row = 0; row < ROWS; row++)
    {
        for (col = 0; col < COLS; col++)
        {
            printf("\n%d ",multi[row][col]);
            printf("%d ",*(*(multi + row) + col));
        }
    }
    return 0;
}
4

5 回答 5

7

它没有。multi是一个二维数组,因此当您对其执行指针算术时,取消引用它会衰减到的指针会产生一个数组(它是COLS元素宽的)。

脚步:

  1. int multi[ROWS][COLS];- 这multi是一个二维数组。

  2. multi + row- 这里multi衰减成一个类型的指针int (*)[COLS]

  3. *(multi + row)- 这等价于multi[row],即这个表达式的类型是int[COLS]

于 2013-06-10T11:11:41.520 回答
4

因为 multi 是一个二维数组,它的计算结果是一个块指针。

*(*(multi + row));

应该给你一个价值。

*(multi + row);

计算为指向其索引由 'row' 确定的行的指针

更新

块指针仍然包含与其他指针一样的地址,但它是对块而不是单个元素进行算术运算,例如指向数组第一行的指针。如果你增加它,它会跳过一行数组(而不是像普通指针那样的一个元素)。

于 2013-06-10T11:11:58.170 回答
2

multi具有“数组数组”形式的类型,因此在大多数情况下,它会衰减为“指向数组的指针”形式的类型。添加后row,它仍然具有“指向数组的指针”类型,但可能指向的数组不是multi.

现在,将*运算符应用于“指向数组的指针”会产生一个数组类型,该类型再次衰减为指向其初始元素的指针。该指针的类型为“pointer to int”。

于 2013-06-10T11:15:26.303 回答
1

multi是iearray的一个。integer arrayint (multi[rows])[cols]

multi可以衰减为指向integer array. 所以 multi 可以衰减到int (*multi)[cols].

所以当你这样做时,multi+rows你实际上是在这样做

sizeof(int [cols]) + sizeof(int[cols])...`row` times 

当你取消引用它时,你会得到一个类型的元素,array of intsaddress你得到的整数数组的第一个元素multi+row。现在向这个取消引用的指针添加偏移量,然后再次取消引用,您将获得元素,即

*(multi+row) /*call this x*/-->gives an element of type int[] and int[] can decay to int*.
*(x+cols) --> gives you the element.
于 2013-06-10T11:40:34.670 回答
1

因为它是一个二维数组,所以在获取值之前要经过两个间接级别。

于 2013-06-10T11:12:08.350 回答