You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历指针数组?基于指针实现按小时数遍历数组的代码疑问

解决指针数组的多次遍历问题

看起来你现在的核心问题应该是第一次外层循环(小时循环)执行完后,后续的小时循环里内层的指针遍历直接跳过了对吧?我来帮你分析下问题所在,然后给出修复方案:

问题根源

你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:51:14