2D阵列的行为

Kev*_*rds 16 c c++ arrays pointers output

我创建了一个2D数组,并尝试打印某些值,如下所示:

int a[2][2] = { {1, 2}, 
                {3, 4}};

printf("%d %d\n", *(a+1)[0], ((int *)a+1)[0]);
Run Code Online (Sandbox Code Playgroud)

输出是:

3 2
Run Code Online (Sandbox Code Playgroud)

我理解为什么3是第一个输出(a+1指向第二行,我们打印它的0th元素.

我的问题是关于第二个输出,即2.我的猜测是,由于类型转换aint *,所述2D阵列像一维数组进行处理,并且因此a+1充当指向2nd元素,所以我们得到的输出作为2.

我的假设是正确的还是背后还有其他一些逻辑?
另外,原来什么是a被当作​​指针int (*)[2]int **?的类型?

Vla*_*cow 10

当你写表达式

(int *)a
Run Code Online (Sandbox Code Playgroud)

那么逻辑上原始数组可以通过以下方式被视为一维数组

int a[4] = { 1, 2, 3, 4 };
Run Code Online (Sandbox Code Playgroud)

因此表达式a指向第一个元素,等于这个虚构数组的1.表达式( a + 1 )指向虚数组的第二个元素,等于2,表达式 ( a + 1 )[0]返回对此元素的引用,即得到2.


hac*_*cks 9

我的假设是正确的还是背后还有其他一些逻辑?

是.

*(a+1)[0]相当于a[1][0].
((int *)a+1)[0]相当于a[0][1].

说明:

a衰减指向2D数组的第一个元素,即指向第一行.*a取消引用该行为2的数组int.因此*a可以将其视为第一行的数组名称,它进一步衰减到指向其第一个元素的指针,即1.*a + 1将指向第二个元素.解除引用*a + 1会给出1.所以:

((int *)a+1)[0] == *( ((int *)a+1 )+ 0) 
                == *( ((int *)a + 0) + 1) 
                == a[0][1]   
Run Code Online (Sandbox Code Playgroud)

需要注意的是a,*a,&a,&a[0]&a[0][0]都具有相同的地址值虽然他们是不同类型的.衰变后,a是类型int (*)[2].将其转换为int *仅使地址值键入int *,算术(int *)a+1给出第二个元素的地址.

另外,原来什么是被当作指针(int (*)[2]int **?的类型?

它成为2的数组int的类型指针,即int (*)[2]

  • @haccks这就像是供应未煮熟的比萨饼而没有给顾客浇头,大喊"订购!",然后当他们指出所供应的披萨根本不够时会变酸.除此之外,你为什么甚至提供版本的答案?记录中的3个和那些不包括的小的...... (3认同)
  • @ryyker我相信我所说的不是要脱离它的背景.*haccks*在他第一次发表评论时就耐心说了些什么; 我认为我理所当然地将其解释为"在判断我的答案时不要那么快,那时候还没完成,我还在准备它."*.当然,我也可以改善他们的答案; 这里的问题是他显然已经发布了第一个版本,他的脑海中提出了一个编辑,我从来没有做过.如果你愿意,请反驳我,过早发布答案,同时意识到它尚未完成是不合适的. (3认同)
  • 这个答案没有解释为什么会出现这种情况.从输出的数字中可以清楚地看出等价,请说明所述等价的原因.它也没有在帖子的最后回答这个问题. (2认同)
  • 根据网站规则,我根据帖子的当前状态进行投票,而不是根据网站的具体情况进行投票.因此,我已经改变了我的投票,因为该帖子回答了这个问题. (2认同)
  • @ThoAppelsin - 你有没有改进过你的一个答案?天啊.看看SO上的一些最佳答案,其中大多数都有几个编辑.***[这个例如,15个编辑](http://stackoverflow.com/a/1433387/645128)***编辑改善答案没有错. (2认同)