c ++与指针反向打印数组内容 - 为什么这个方法有效?

时间:2016-02-14 17:22:10

标签: c++ arrays pointers

来自C ++早期对象 - 加迪斯,第8版。我在SO上注意到类似的问题,但没有一个能回答这个问题。考虑一下这个简单的程序:

// This program uses a pointer to display
// the contents of an array.
#include <iostream>
using std::cout;

int main(){
    const int SIZE = 8;
    int set[ ] = {5, 10, 15, 20, 25, 30, 35, 40};
    int *numPtr;   // Pointer   

    // Make numPtr point to the set array.
    numPtr = set;

    // Use the pointer to display the array elements
    cout << "The numbers in set are:\n";
    for (int index = 0; index < SIZE; index++) {
        cout << *numPtr << " ";
        numPtr++;
    }

    // Display the array elements in reverse order
    cout << "\nThe numbers in set backwards are:\n";
    for (int index = 0; index < SIZE; index++) {
        numPtr--;
        cout << *numPtr << " ";
    }
    return 0;
}

作品,我测试过了!但从概念上讲,numPtr指向数组的起始地址&#34; set&#34 ;,那么如何递增numPtr&#34;向后&#34;从起始地址开始不会在第二次(反向)for循环的第一次迭代中导致段错误?重述这个问题,numPtr&#34;如何知道&#34;从数组的最后一个元素的地址开始&#34;设置&#34;? 温柔,我在CS II的介绍中...谢谢!

3 个答案:

答案 0 :(得分:4)

当你的第二个循环开始时,numPtr点在set的最后一个元素后面,因为你在第一个循环中增加了它。

没有第一个循环,就会失败。

答案 1 :(得分:2)

开始时,numPtr指向集合的开头。然后,在第一个操作中 ,您递增numPtr ,直到它指向集合的结尾。

当您到达第二次迭代时,numPtr位于set+sizeof(set)-1,因此您可以减少它以使您的设置倒退。

答案 2 :(得分:0)

numPtr 指向完成第一个循环后的最后一个元素。因为在循环中你增加 numPtr 。并在你的第二个循环中你递减 numPtr ,完成后会指出第一个元素。

  

如果没有第一个循环,您可以通过这种方式反转设置。

#include <iostream>
using std::cout;

int main(){
    const int SIZE = 8;
    int set[ ] = {5, 10, 15, 20, 25, 30, 35, 40};
    int *numPtr;  
    numPtr = set;
    cout << "\nThe numbers in set backwards are:\n";
    for (int index = 0; index < SIZE ; index++) {
        cout << *(numPtr+SIZE-1-index) << " ";
    }
    return 0;
}
  

<强>输出:

The numbers in set backwards are:
40 35 30 25 20 15 10 5