为什么*(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;
}
答案 0 :(得分:7)
没有。 multi
是一个二维数组,因此当你对其执行指针运算时,取消引用它衰减的指针会产生一个数组(COLS
个元素宽。)
步骤:
int multi[ROWS][COLS];
- 此处multi
是一个二维数组。
multi + row
- 此处multi
朽烂为int (*)[COLS]
*(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)
multi
是array
integer array
,int (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.