我在C中遇到了这个编码问题而我无法完全弄清楚逻辑。我有一个3D数组:
a[2][3][2] = {{{a1,b1},{a2,b2},{a3,b3}},{{c1,d1},{c2,d2},{c3,d3}}};
现在,如果我写 a [1] [0] -a [0] [0] ,那么 a [1] [0] 指向的内存位置第二个子集的第一个元素(我不知道这里的正确术语到底是什么),即{c1,d1}的起始位置(我希望这是正确的吗?)。类似地, a [0] [0] 指向第一个子集的第一个元素的起始地址,即{a1,b1}。
所以在这个意义上,如果我写 a [1] -a [0] 那么它应该指向第一个子集的起始位置,即 {{a1,b1},{ a2,b2},{a3,b3}} 以及第二个子集 {{c1,d1},{c2,d2},{c3,d3}} 的起始位置意见应与 a [1] [0] -a [0] [0] 相同。
然而,当我打印这两个值时,第一个值为6,第二个值为3。在我的逻辑中我到底出错了什么?
答案 0 :(得分:2)
你正在思考。 a[0][0]
会衰减到指向数组0
的行a
的第一个元素的指针。 a[1][0]
衰减到数组1
的行a
的第一个元素。
现在,重点是 两个指针的差异是什么 ?
当从另一个指针中减去指针时,结果是指针之间的距离(在数组元素中测量)。
现在,可以很容易理解,a[1][0] - a[0][0]
会给出a[1][0]
和a[0][0]
之间的距离,即6
(6
个元素在这两个地址之间:a1, b1, a2,b2,a3,b3
)。另一方面,a[1] - a[0]
将给出这两个指针之间的距离,即3
(这两个地址之间有3
个元素:{a1, b1}, {a2, b2}, {a3, b3}
)。
注意数组a[][]
包含6
个元素,而数组a[]
只有3
个元素。 a1,b1,a2,b2....
不是a[]
的元素。
答案 1 :(得分:0)
Interessant问题。 :)
我假设你知道数组元素访问和地址差异之间的区别。
a [1] -a [0]以3个步骤跳转元素。
a [1] [0] -a [0] [0]以6个步骤跳转元素。
a [1]在char * [2]衰变。从c1到a1需要3 * 2步。
a [1] [0]在char *中衰变。从c1到a1需要6个步骤。
答案 2 :(得分:0)
假设a是一个char数组,那么你将看到a [1] -a [0] = 3,a [1] [0] - a [0] [0] = 6。虽然[0]和[0] [0]的位置(地址)相同,但[1]和[1] [0]相同。产生差异的原因是编译器正在进行数学运算,而不是字节数,而是类型大小。 a [0]指向的类型的大小为2,因此即使位置相距6个字节,差异也是3个数组元素。同样地,对于[1] [0] -a [0] [0],大小为1并且它们相隔6个字节。数组差异在元素中,而不是字节。