【发布时间】:2013-12-11 16:13:26
【问题描述】:
我写了以下代码:
#include <iostream>
using namespace std;
int main()
{
int a[10][10];
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
a[i][j] = i * j;
cout << *(*(a + 3) + 4) << endl;
return 0;
}
我期待它打印一些垃圾数据或分段错误。我得到的是 12。我在 c 和 c++ 中都对其进行了测试(分别使用 gcc 和 g++),尽管我还没有测试过,但我在 VS 上的效果是一样的。为什么这会起作用,是否有关于这种行为的官方文档?
【问题讨论】:
-
为什么它不能工作?
-
提示:
a[b] == *(a+b) -
@KirilKirov 我认为人们可能认为它不应该以这种方式工作的一个原因是人们可能认为将 3 添加到指针会将其指向的地址移动 3 个字节。要回答 OP 的问题,将 3 添加到指针会将其指向的地址移动
3 * sizeof(T)字节,其中T是指针所指的对象类型。这就是为什么保持指针类型正确很重要的原因,以及为什么不只是一个名为pointer的通用类型,或者为什么我们不只对所有内容都使用void*。 -
@Andrey - 是的,这是我的第一个想法,但后来我在标题中看到了“指针算术”,这是确切的术语,所以我决定让 OP 熟悉这一点。无论如何:)
标签: c++ c multidimensional-array pointer-arithmetic