如何遍历指针数组?基于指针实现按小时数遍历数组的代码疑问
解决指针数组的多次遍历问题
看起来你现在的核心问题应该是第一次外层循环(小时循环)执行完后,后续的小时循环里内层的指针遍历直接跳过了对吧?我来帮你分析下问题所在,然后给出修复方案:
问题根源
你的ptrSvr指针在第一次内层while循环结束后,已经移动到了last指针的下一个位置(因为最后一次ptrSvr++后,ptrSvr会大于last)。后续外层循环执行时,ptrSvr <= last的条件不再成立,所以内层循环根本不会运行。
修复方案:每次循环重置指针到数组起点
你需要在每次外层循环(小时循环)开始时,把ptrSvr重置回数组的起始位置。最简单的方式是先保存一个起始指针的副本,然后每次循环开头重置回去:
修改后的完整代码示例
#include <iostream> #include <cstdlib> #include <ctime> using namespace std; void rand_set(int* &ps) { *ps = rand() % 10; } void print(int* ps) { cout << " " << *ps << " "; } int main() { // 假设这里已经初始化了你的指针数组,比如: int arr[5]; // 示例数组,长度5 int* ptrSvr = arr; int* last = arr + 4; // 指向数组最后一个元素(索引4) int totalHours = 3; // 示例小时数 srand(time(0)); // 初始化随机数种子,避免每次随机序列相同 int* startPtr = ptrSvr; // 保存数组的起始指针位置 for (int i = 0; i < totalHours; i++) { cout << "Hour " << i + 1 << ":"; ptrSvr = startPtr; // 每次小时循环都重置指针到数组开头 while (ptrSvr <= last) { rand_set(ptrSvr); print(ptrSvr); ptrSvr++; } cout << endl; } return 0; }
额外注意事项
- 确保
last指针确实指向数组的最后一个元素,而不是数组末尾的下一个位置。比如长度为n的数组,last应该是数组名 + n - 1,否则会出现越界访问的问题。 - 一定要在程序开头调用
srand(time(0));初始化随机数种子,否则每次运行程序,rand()生成的随机数序列都是一样的,达不到随机效果。 - 如果不想额外用
startPtr,也可以直接用数组的起始地址重置,比如ptrSvr = arr;,但用startPtr的方式更通用,不管你的指针数组是怎么初始化的都能适用。
内容的提问来源于stack exchange,提问作者Airvvic
相关产品推荐
相关产品推荐

