我有这个多维数组:
char marr[][3] = {{"abc"},{"def"}};
现在,如果我们按照定义(ISO / IEC 9899:1999)遇到表达式*marr
,它说(我引用)
如果操作数的类型为“指向类型的指针”,则结果的类型为“type”
我们在那个表达式中,marr衰变到指向他的第一个元素的指针,在这种情况下是一个指向数组的指针,所以当我们得到表达式* marr时,我们得到大小为3的'type'数组。所以我的问题是为什么当我们做(* marr)+ 1时,我们只向地址添加1个字节而不是3,这是数组的大小。
请原谅我的无知我不是一个非常聪明的人,有时我会被困在这样的琐碎事情上。
感谢您的时间。
答案 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个字节,因为此数组的类型为char
且sizeof(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
首先解除引用。