指针算术

时间:2010-04-18 12:03:55

标签: c++ pointers

有代码:

int** a = new int*[2];
a[0] = new int(1);
a[1] = new int(2);
cout << "a[0] " << a[0] << '\n';
cout << "a[1] " << a[1] << '\n';
cout << "a[2] " << a[2] << '\n';
cout << "a[0] + 1 " << a[0] + 1 << '\n';//WHY THIS ISN'T == a[1] ?
cout << "*(a + 1): " << *(a + 1) << '\n'; //WHY THIS IS == a[1] ?
cout << "a[0] - a[1] " << static_cast<int>(a[0] - a[1])<< '\n';//WHY THIS IS == 16 not 4?

cout << sizeof(int**);

问题包含在代码中的相关行旁边。

4 个答案:

答案 0 :(得分:9)

a[0] + 1表示将添加到a[0]

中存储的值

*(a + 1)表示1 * sizeof(int)已添加到a的内存地址,然后访问该位置的值,这意味着您获得a[1] < / p>

详细了解指针here

至于你的上一个问题,不能保证它会打印任何特定值,因为两个内存地址不必是连续的。对我来说,例如打印-4

答案 1 :(得分:5)

a[0]a[1]是连续的,它们都是指针,但它们并不指向连续的内存区域。

那是因为new运算符返回的内存指针实际上是不可预测的。

换句话说,无法保证(实际上完全相反)

返回的内存块
a[0] = new int(1);
a[1] = new int(2);

是连续的。

答案 2 :(得分:1)

a[0] + 1访问a中的第一个元素并添加1。

a[1]访问。

中的第二个元素

*(a + 1)a[1]的同义词。

static_cast<int>(a[0] - a[1])从。

中的第一个元素中减去a中的第二个元素

答案 3 :(得分:1)

  1. 您取零位置的值并为其添加1。
  2. 你取数组的开头将指针推进一个int指针的大小,并取指针指向的值为[1]。
  3. 这可能是任何事情。您将减去不同的地址并将其转换为int。