2011-12-05 32 views
4

我有这个多维数组:取消引用多维数组名和指针运算

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

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

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

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

打扰我的无知我不是一个非常聪明的人我有时候会卡住这样的琐事。

谢谢你的时间。

+0

“abc”的大小为4,char a [4] =“abc”; // {'a','b','c','\ 0'} – BLUEPIXY

回答

1

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

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

当取消引用char [][]将在表达式中使用char *

要添加3,您需要首先,然后做算术解引用:

*(marr+1) 

你正在做的:

(*marr)+1 

其解引用第一。

+0

感谢您的快速回答我理解你在这里所说的一切,除了当你说“当你解引用一个char [] []时,它将在表达式中用作char *”为什么?数组的名称是否衰减为指向其第一个元素的指针,在这种情况下,它是指向大小为3的数组的指针,因此该类型是大小为3的char数组? – wel

+0

@wel yep,char [] []将衰减到char(*)[],对不对? (指向数组的指针,就像你说的),所以当你解引用它时,你将会有一个char数组。但是,这个在表达式中使用时,会衰减到指向其第一个元素的指针(所以再次),所以您最终得到了char *。并增加一个字符的指针加1。如果你做*(marr + 1),首先你将marr腐烂成一个指向3号数组的指针,然后递增它的类型大小(这是char大小3的数组),所以你得到+3的增量。然后你解除这一个。这是一种很难,是的... – sidyll

+0

感谢我的朋友,我已经得到它。我首先想到这一点,但非常不确定感谢您的耐心和时间。你的回答非常有帮助。 – wel

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]),然后解引用。
+0

谢谢您的致谢,您的回答也非常感谢和帮助。你们很棒。 – wel