有代码:
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**);
问题包含在代码中的相关行旁边。
答案 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])
从。
答案 3 :(得分:1)