C 解引用多维数组名和指针算法

C 解引用多维数组名和指针算法,c,pointers,multidimensional-array,pointer-arithmetic,C,Pointers,Multidimensional Array,Pointer Arithmetic,我有一个多维数组: char marr[][3] = {{"abc"},{"def"}}; 现在,如果我们根据定义遇到表达式*marr(ISO/IEC 9899:1999),它会说(我引用) 如果操作数的类型为“指向类型的指针”,则结果的类型为“类型” 在这个表达式中,marr衰减为指向他的第一个元素的指针,在这个例子中是指向数组的指针,所以当我们有表达式*marr时,我们得到大小为3的“type”数组。所以我的问题是为什么当我们使用(*marr)+1时,我们只向地址添加1字节,而不是数组大小

我有一个多维数组:

char marr[][3] = {{"abc"},{"def"}};
现在,如果我们根据定义遇到表达式
*marr
(ISO/IEC 9899:1999),它会说(我引用)

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

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

请原谅我的无知我不是一个很聪明的人我有时会被这样的小事缠住


谢谢您的时间。

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

char *p = 0x00;
++p; /* is now 0x01 */
取消引用
char[][]
时,它将用作表达式中的
char*

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

*(marr+1)
你在做:

(*marr)+1

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

*marr == marr[0] == &marr[0][0]
(*marr) + 1 == &marr[0][1]
如果您刚刚使用了
charsingle_数组[3]={“abc”}
,您希望
单个数组+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])
    ,然后取消引用

谢谢你的快速回答,我理解你在这里所说的一切,除了你说“当你取消引用字符[][]时,它将被用作表达式中的字符*”这是为什么?数组的名称不是衰减为指向其第一个元素的指针吗?在本例中,第一个元素是指向大小为3的数组的指针,因此类型是大小为3的char数组?@wel-yep,char[][]将衰减为char(*)[],对吗?(指向数组的指针,正如您所说)所以当您取消引用它时,您将得到一个char数组。但是,当在表达式中使用这个元素时,它会衰减为指向它的第一个元素的指针(再次),因此最终会得到char*。将指向字符的指针加1。如果改为*(marr+1),首先将marr分解为一个指向大小为3的数组的指针,并增加它的类型大小(即大小为3的char数组),因此得到+3的增量。然后你去引用这个。这有点难,是的…谢谢我的朋友,我现在拿到了。一开始我有点这样想,但很不确定,谢谢你的耐心和时间。你的回答非常有用。很高兴能帮助@wel。这些事情真的很令人困惑!祝福并欢迎来到StackOverflow!谢谢你,先生,你的回答也是非常感谢和有益的。你们太棒了。“abc”的大小是4,字符a[4]=“abc”//{a'、'b'、'c'、'\0'}