指针打印问题

时间:2018-03-06 23:53:42

标签: c++ arrays pointers

我试图让代码打印“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 );

}

3 个答案:

答案 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。

如果要从数组的最后一个元素开始打印,则需要在指向最后一个元素时从指针获取值;在你递减指针之后。