取消引用多维数组名称和指针算法

时间:2011-12-05 20:03:58

标签: c pointers multidimensional-array pointer-arithmetic

我有这个多维数组:

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

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

  

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

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

请原谅我的无知我不是一个非常聪明的人,有时我会被困在这样的琐碎事情上。

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

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

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

如果您只有char single_array[3] = {"abc"};,您希望single_array + 1在内存中前进多远? 1个字节,而不是3个字节,因为此数组的类型为charsizeof(char)为1。

如果您执行了*(marr + 1),那么您将引用marr[1],然后您可以将其视为3个字节。 marr + 1的类型为char[][3],增量大小为sizeof(char[3])

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

  • 第一个被解除引用到char[3],然后递增,因此增量大小为sizeof(char)。
  • 第二个是递增char[][3],因此增量大小为sizeof(char[3]),然后解除引用。

答案 1 :(得分:1)

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

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

当您取消引用char [][]时,它将在表达式中用作char *

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

*(marr+1)

你在做:

(*marr)+1

首先解除引用。