4

我有这个多维数组:

char marr[][3] = {{"abc"},{"def"}};

现在,如果我们根据定义遇到表达式*marr(ISO/IEC 9899:1999),它会说(我引用)

如果操作数的类型为“类型指针”,则结果的类型为“类型”

在那个表达式中,marr 衰减到指向他的第一个元素的指针,在这种情况下,它是一个指向数组的指针,所以当我们有表达式 *marr 时,我们得到大小为 3 的“type”数组。所以我的问题是为什么当我们执行 (*marr) + 1 时,我们只向地址添加 1 个字节而不是数组大小的 3。

原谅我的无知,我不是一个很聪明的人,我有时会被这样的琐碎事情困住。

感谢您的时间。

4

2 回答 2

3

递增(*marr)向前移动 1 个字节的原因是因为*marr指的是 a char[3], {"abc"}。如果您还不知道:

*marr == marr[0] == &marr[0][0]
(*marr) + 1 == &marr[0][1]

如果你刚刚,你希望在记忆中前进char single_array[3] = {"abc"};多远?single_array + 1右边 1 个字节,而不是 3,因为这个数组的类型是 1char并且sizeof(char)是 1。

如果您这样做了*(marr + 1),那么您将指的是marr[1],您可以期望它在 3 个字节之外。marr + 1是 类型char[][3],增量大小是sizeof(char[3])

上述两个示例的主要区别在于:

  • 第一个被取消引用到 a char[3],然后递增,因此增量大小是sizeof(char)。
  • 第二个是递增 a char[][3],因此增量大小是sizeof(char[3]),然后取消引用。
于 2011-12-05T20:45:07.740 回答
1

它加了一个,因为类型是 char(1 字节)。就像:

char *p = 0x00;
++p; /* is now 0x01 */

当您取消引用 achar [][]时,它将作为char *表达式使用。

要添加 3,您需要先进行算术运算,然后再取消引用:

*(marr+1)

你在做:

(*marr)+1

首先取消引用。

于 2011-12-05T20:13:30.407 回答