首页 > 后端开发 > C++ > 正文

C++11的范围for循环可以用于原始指针和数组吗

P粉602998670
发布: 2025-09-11 09:28:01
原创
390人浏览过
范围for循环要求对象支持begin()和end(),以便获取迭代器进行遍历,适用于数组、标准容器等可迭代类型。

c++11的范围for循环可以用于原始指针和数组吗

在C++11中,范围for循环(range-based for loop)只能用于“可迭代”的对象,也就是说,该对象必须支持

begin()
登录后复制
end()</)
登录后复制
函数。我们来分别看原始指针和数组的情况。

1. 范围for循环与普通数组

对于具有已知大小的普通数组(即在作用域内定义的数组),范围for循环是可以使用的。

示例:
int arr[] = {1, 2, 3, 4, 5};
for (int x : arr) {
    std::cout << x << " ";
}
登录后复制

这段代码是合法的。因为在数组的上下文中,编译器知道

arr
登录后复制
的类型是
int[5]
登录后复制
,可以推导出
begin(arr)
登录后复制
end(arr)
登录后复制
,从而支持范围for。

2. 范围for循环与原始指针

如果变量只是一个原始指针(例如通过

new
登录后复制
分配或传入函数的指针),则不能直接使用范围for循环,因为指针不携带大小信息,也无法推导出
begin
登录后复制
end
登录后复制

立即学习C++免费学习笔记(深入)”;

错误示例:
int* ptr = new int[5]{1, 2, 3, 4, 5};
for (int x : ptr) {  // 编译错误!ptr是指针,不是数组
    std::cout << x << " ";
}
登录后复制

这会引发编译错误,因为

ptr
登录后复制
的类型是
int*
登录后复制
,而
std::begin(ptr)
登录后复制
无法确定数组边界。

协和·太初
协和·太初

国内首个针对罕见病领域的AI大模型

协和·太初 38
查看详情 协和·太初

3. 在函数参数中传递数组退化为指针

即使你定义了一个数组并传入函数,如果参数是按指针接收的,也会失去数组大小信息。

示例:
void func(int arr[]) {  // 实际上等价于 int* arr
    for (int x : arr) { // 编译错误!arr退化为指针
        // ...
    }
}
登录后复制

这种情况下,

arr
登录后复制
已经是指针,不能再用于范围for循环。

4. 如何安全使用范围for

推荐使用标准容器或

std::array
登录后复制
,它们天然支持范围for循环。

推荐方式:
std::array<int, 5> arr = {1, 2, 3, 4, 5};
for (int x : arr) {
    std::cout << x << " ";
}
登录后复制

或者使用

std::vector
登录后复制

std::vector<int> vec = {1, 2, 3, 4, 5};
for (int x : vec) {
    std::cout << x << " ";
}
登录后复制

基本上就这些。范围for循环对普通数组有效,但对原始指针无效,因为缺少迭代所需的边界信息。使用现代C++容器能避免这类问题。

以上就是C++11的范围for循环可以用于原始指针和数组吗的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号