来自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的介绍中...谢谢!
答案 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