这段代码究竟指向哪个数组条目?

时间:2014-01-10 16:18:41

标签: c arrays pointers pointer-arithmetic multidimensional-array

我在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。在我的逻辑中我到底出错了什么?

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]之间的距离,即66个元素在这两个地址之间: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个字节。数组差异在元素中,而不是字节。