C++打印数组内容与指针反向-为什么这个方法有用? < C++ >早期对象-加迪斯,第八版。我注意到类似的问题,但没有回答这方面的问题。考虑这个简单的程序: // 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; }

C++打印数组内容与指针反向-为什么这个方法有用? < C++ >早期对象-加迪斯,第八版。我注意到类似的问题,但没有回答这方面的问题。考虑这个简单的程序: // 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; },c++,arrays,pointers,C++,Arrays,Pointers,行,我测试过了!但从概念上讲,numPtr指向数组集的起始地址,那么从起始地址向后递增numPtr如何不会在第二个反向for循环的第一次迭代中导致segfault呢?重复这个问题,numPtr如何知道从数组集最后一个元素的地址开始? 温柔一点,我在介绍CS II。。。谢谢 在第二个循环开始时,numPtr落后于set的最后一个元素,因为您在第一个循环中增加了它 如果没有第一个循环,它将失败。在第二个循环开始时,numPtr落后于集合的最后一个元素,因为您在第一个循环中增加了它 如果没有第一个循环

行,我测试过了!但从概念上讲,numPtr指向数组集的起始地址,那么从起始地址向后递增numPtr如何不会在第二个反向for循环的第一次迭代中导致segfault呢?重复这个问题,numPtr如何知道从数组集最后一个元素的地址开始?
温柔一点,我在介绍CS II。。。谢谢

在第二个循环开始时,numPtr落后于set的最后一个元素,因为您在第一个循环中增加了它


如果没有第一个循环,它将失败。

在第二个循环开始时,numPtr落后于集合的最后一个元素,因为您在第一个循环中增加了它

如果没有第一个循环,它将失败。

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

当您到达第二次迭代时,numPtr处于set+sizeofset-1,因此您可以减小它以使集合向后。

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

当您到达第二次迭代时,numPtr处于set+sizeofset-1,因此您可以减小它以使集合向后移动。

numPtr指向完成第一个循环后的最后一个元素。因为在您的循环中增加numPtr。在第二个循环中减小numPtr,完成后将指向第一个元素

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

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

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


提示:NUMPTT+++对JUNPANPANZA的暗示建立了NUMPTR。你必须把代码作为一个整体来考虑。正如您所知,numPtr是一个指针,它的值可以在整个执行过程中更改。仔细想想代码的逻辑,看看你是否能弄清楚它是如何变化的。科迪,谢谢,明白了,现在我想看看如何在不做第一个循环的情况下向后迭代数组。似乎有点像@Shitsu注意到的指针算法,set+sizeofset-1就可以了。第一个循环有效地执行numpr+=SIZE,,。如果删除第一个循环,那么这就是需要添加到代码中的内容。在C和C++中,递增指针的元素大小会增加它。提示:NUMPTT+++对JunCopopZa提示的NUMPTR构建有什么作用,你必须考虑代码作为一个整体。正如您所知,numPtr是一个指针,它的值可以在整个执行过程中更改。仔细想想代码的逻辑,看看你是否能弄清楚它是如何变化的。科迪,谢谢,明白了,现在我想看看如何在不做第一个循环的情况下向后迭代数组。似乎有点像@Shitsu注意到的指针算法,set+sizeofset-1就可以了。第一个循环有效地执行numpr+=SIZE,,。如果删除第一个循环,那么这就是需要添加到代码中的内容。在C和C++中,递增一个指针就其元素大小而言递增。谢谢,两个答案都很好,选择了Shitsu's,因为它进入了一点细节。Dohh!谢谢,两个答案都很好,选择了Shitsu的,因为它有点详细。
#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