使用指针进行2D Int Array打印

时间:2018-07-21 02:43:27

标签: c

在执行以下代码时:

int main()
{
  int abc[3][3]={0};
  for(int *ip=&abc[0][0];ip<=&abc[3][3];ip++)
  {
    printf("%d   \n",*ip);
  }
}

预期结果为9个零,但显示12个数据。可能是什么原因?

1 个答案:

答案 0 :(得分:2)

如果您查看3x3阵列的内存布局,则它看起来像:

[0][0]          [1][0]        [2][0]         
+----+----+----+----+----+----+----+----+----+
|    |    |    |    |    |    |    |    |    |
+----+----+----+----+----+----+----+----+----+

元素[3][3]在哪里?

[0][0]          [1][0]        [2][0]         [3][0]         [3][3] 
+----+----+----+----+----+----+----+----+----+----+----+----+----+
|    |    |    |    |    |    |    |    |    |    |    |    |    |
+----+----+----+----+----+----+----+----+----+----+----+----+----+

这说明了为什么最终要访问12个元素。

您的代码因访问超出有效索引的行为而受到不确定的行为,但这是另一个问题。

您可以使用:

for (int *ip = &abc[0][0]; ip <= &abc[2][2]; ip++)
{
  printf("%d   \n",*ip);
}

但是,最好将2D数组作为2D数组来访问。

for (size_t i = 0; i < 3; ++i )
{
  for (size_t j = 0; j < 3; ++j )
  {
    printf("%d   \n", abc[i][j]);
  }
}