我试图让代码打印“1000 100 10 1”,但一直得到“100 10 1 0”。有关为什么会发生这种情况的任何想法?任何帮助,将不胜感激。谢谢。
#include <iostream>
using namespace std;
int main()
{
int arr[4] = { 0, 1, 2, 3 };
int *ptr;
ptr = arr;
*ptr = arr[0] + 1; // set arr[0] to 1
* ( ptr + 1 ) = arr[ 0 ] * 10; // set arr[1] to 10
* ( ptr + 2 ) = arr[ 0 ] * 100; // set arr[2] to 100
* ( ptr + 3 ) = arr[ 0 ] * 1000; // set arr[3] to 1000
cout << "arr[4] = { " << arr[0] << ", " << arr[1] << ", " << arr[2] << ", " << arr[3] << " }" << endl;
ptr += 3;
while (ptr >= arr)
{
ptr--;
cout << " " << *ptr;
}
cout << endl;
return( 0 );
}
答案 0 :(得分:3)
ptr += 3
表示您指向arr[3]
,但在使用地址之前您ptr--
,因此您的打印实际上从arr[2]
开始
结束条件也很危险,因为它将ptr
设置为您“不拥有”的地址。从理论上讲,你是安全的,因为你永远不会使用它,但是使用错误值的指针漂浮在...周围仍然是危险的做法...
我会成功:
ptr += 3; // ptr still points to valid memory
while (ptr >= arr)
{
cout << " " << *ptr;
ptr--; // ptr decremented after use so print starts at arr[3]
}
答案 1 :(得分:1)
您将指针移动到最后一个元素,然后在打印前将其恢复到上一个元素。
另请注意,将指针移回第一个元素后会调用未定义的行为。
试试这个:
ptr += 4; // move the pointer one element after the last element (this is allowed unless you dereference it)
while (ptr > arr) // use > instead of >=
{
ptr--;
cout << " " << *ptr;
}
而不是
ptr += 3;
while (ptr >= arr)
{
ptr--;
cout << " " << *ptr;
}
答案 2 :(得分:1)
ptr = arr;
ptr
指向第一个元素
ptr += 3;
现在它指向索引3处的第四个元素;值为1000的最后一个索引。
while (ptr >= arr)
我们进入循环。
ptr--;
我们现在指向第三个元素,索引为2;其中值为100。
cout << " " << *ptr;
我们打印的值为100。
如果要从数组的最后一个元素开始打印,则需要在指向最后一个元素时从指针获取值;在你递减指针之后。