为什么`*(multi + row)`生成指针地址而不是值?

时间:2013-06-10 11:09:39

标签: c pointers multidimensional-array

为什么*(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;
}

5 个答案:

答案 0 :(得分:7)

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

步骤:

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

  2. multi + row - 此处multi朽烂为int (*)[COLS]

  3. 类型的指针
  4. *(multi + row) - 这相当于multi[row],i。即此表达式的类型为int[COLS]

答案 1 :(得分:4)

因为multi是一个2D数组,其值为块指针。

*(*(multi + row));

应该给你一个价值。

*(multi + row);

计算指向索引由'row'

确定的行的指针

更新

块指针仍然包含像其他指针一样的地址,但它的算术运算是在块而不是单个元素上运行,例如指向数组第一行的指针。如果你递增它,它将跳过一行数组(而不是一个正常指针的情况下的一个元素)。

答案 2 :(得分:2)

multi有一种形式为“数组数组”的形式,因此在大多数情况下,它会衰减为“指向数组的指针”形式。添加row后,它仍然具有“指向数组的指针”类型,但可能指向multi中第一个数组(第一行)以外的数组。

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

multiarray integer arrayint (multi[rows])[cols]

multi可以衰减指向integer array的指针。所以多重可以衰减到int (*multi)[cols]

所以当你做multi+rows时,你基本上就是这样做

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

当你取消引用它时,你得到一个array of ints类型的元素,即你在address中得到的整数数组的第一个元素的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.