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])