C++怎么用while循环遍历数组指针

酷婷酱_6344

酷婷酱_6344

2026-09-27

651人浏览

原创

while遍历数组指针必须显式控制边界,不可依赖nullptr或值为0判断结束;最稳妥做法是传入首地址与长度,用临时指针与哨兵地址(如p+len)比较,确保安全遍历。

c++怎么用while循环遍历数组指针

用 while 遍历数组指针,核心是别丢掉边界控制

直接用 while 遍历指针指向的数组,不是靠“指针是否为空”来判断结束——C++ 中数组本身不存长度信息,nullptr 也不代表数组末尾。必须显式提供长度或结束条件,否则极易越界或死循环。

常见错误现象:while (p++) 无终止条件、while (*p) 误把 0 当结束(仅对以 0 结尾的整数数组或字符串有效)、while (p != nullptr) 完全无效。

  • 最稳妥做法:传入数组首地址 + 元素个数,用索引或指针偏移计数
  • 若已知数组以特定值(如 0 或 -1)结尾,且该值在业务中不会正常出现,才可用 while (*p != sentinel)
  • 避免修改原指针变量本身(如 p++ 后丢失首地址),建议用临时指针或索引

while 配合指针偏移遍历:推荐写法

用一个临时指针从首地址出发,配合已知长度做递增和比较,逻辑清晰、不易出错。

<pre class="brush:php;toolbar:false;">int arr[] = {1, 2, 3, 4, 5};
int* p = arr;
int len = sizeof(arr) / sizeof(arr[0]);
int* end = p + len; // 指向末尾后一位置
<p>while (p != end) {
std::cout </p><p>这里 <code>end</code></p><div class="aritcle_card flexRow artxards">
											<div class="artcardd flexRow">
												<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill4025" title="C++ 算法竞赛自动化测试数据生成与校验框架"><img
														src="https://img.php.cn/upload/skill/000/000/081/178988956499722.jpg" alt="C++ 算法竞赛自动化测试数据生成与校验框架" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
												<div class="aritcle_card_info flexColumn">
													<a rel="nofollow" href="/xiazai/skill4025" title="C++ 算法竞赛自动化测试数据生成与校验框架" class="overflowclass">C++ 算法竞赛自动化测试数据生成与校验框架</a>
													<p class="overflowclass">根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。</p>
												</div>
												<a rel="nofollow" href="/xiazai/skill4025" title="C++ 算法竞赛自动化测试数据生成与校验框架" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
												</a>
											</div>
										</div>
是关键:它不是 nullptr,而是合法的“哨兵地址”,符合 C++ 指针算术规则。注意 p != end 比 p 更通用(适用于所有随机访问迭代器),且不会因有符号比较引发警告。<ul> <li> <code>p + len 必须在定义时计算,不能在循环中反复调用 sizeof(对指针参数无效)
  • 若函数接收的是 int* p 参数,必须额外传入 size_t n,无法仅靠指针还原长度
  • 使用 ++p 而非 p++,避免多余拷贝(虽对内置类型影响极小,但属良好习惯)
  • 用 while 遍历字符串字面量指针:小心 \0 的陷阱

    字符数组(尤其是字符串字面量)常被误认为天然支持 while (*p),但它只对以 '\0' 结尾的 char* 有效,且要求内容中不出现中间 '\0'。

    <pre class="brush:php;toolbar:false;">const char* s = "hello";
    while (*s) {
        std::cout <p>这段代码能工作,但前提是 <code>s</code></p>
    确实是以 '\0' 结尾的 C 风格字符串。换成 int* 或其他类型,*p == 0 就不再是安全的终止条件。
    • while (*s++) 把解引用和自增写在一起,可读性差,且容易在调试时漏看副作用
    • 对宽字符(wchar_t*)或编码不确定的字符串,*s 判断更不可靠
    • 如果源数据来自二进制 buffer 或用户输入,绝不能假设含 '\0'

    为什么不用 for?其实 while 在某些场景更自然

    当遍历逻辑不是简单线性递增,而是依赖状态变化(比如跳过某些元素、按条件步进、或与外部事件同步)时,while 的控制流更直观。例如解析一组以分隔符隔开的整数:

    <pre class="brush:php;toolbar:false;">int* p = data;
    int* limit = data + count;
    while (p <p>这种非固定步长、带分支提前退出的场景,硬套 <code>for (int i = 0; i  反而要额外维护索引和 break/continue 逻辑,不如 <code>while</code> 直接。</code></p>
    • 别为了“统一风格”强行把所有遍历都写成 while;也别因教科书常用 for 就排斥 while
    • 真正要注意的是:无论用哪种循环,终止条件必须明确、可验证、不依赖未定义行为
    • 指针遍历的复杂点从来不在语法,而在你是否清楚那个“停在哪里”的答案从哪来

    C++免费学习笔记(深入):立即使用
    在学习笔记中,你将探索 C++ 的入门与实战技巧!

    相关文章

    PHP速学视频免费教程(入门到精通)
    PHP速学视频免费教程(入门到精通)

    PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    相关专题

    更多
    c++和c语言的区别有哪些
    c++和c语言的区别有哪些

    c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

    2024.03.14

    2168

    9

    c++和python学习顺序推荐
    c++和python学习顺序推荐

    一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

    2024.03.14

    979

    6

    python和c++学习性价比分析
    python和c++学习性价比分析

    Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

    2024.03.14

    387

    5

    c语言和c++一样吗
    c语言和c++一样吗

    c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    2024.03.14

    307

    5

    c语言和c++先学哪个好
    c语言和c++先学哪个好

    初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    2024.03.14

    366

    5

    c语言和c++的区别和联系
    c语言和c++的区别和联系

    c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    2024.03.14

    580

    5

    c++软件中文更改教程
    c++软件中文更改教程

    对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

    2024.03.21

    1389

    9

    python和java和c++学习性价比分析
    python和java和c++学习性价比分析

    Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

    2024.03.22

    1177

    7

    c++和c语言学习顺序推荐
    c++和c语言学习顺序推荐

    对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

    2024.03.25

    1305

    9

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    C++ 手册教程
    C++ 手册教程

    共41课时 | 78万人学习

    Conan 2 Essentials 免费课程
    Conan 2 Essentials 免费课程

    共0课时 | 0人学习

    CMake 与 Conan 集成实践
    CMake 与 Conan 集成实践

    共0课时 | 0人学习