我是C++的初学者,试图通过编写尽可能多的各种小程序(programmlets)来了解我遇到的每个新概念.所以我刚刚编造了以下代码:
#include <iostream>
using namespace std;
int main(){
int inumbers[] = {1 ,2 , 3, 4, 5};
int *p;
int i;
p = inumbers;
for(i = 0; p[i]; i++) cout << p[i] << '\n';
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我无法理解一个看似简单的事情:编译器如何"知道"何时停止递增循环变量"i"?令人惊讶的是,代码确实按照预期的方式工作.
Nat*_*ica 10
编译器不知道何时停止.
for(i = 0; p[i]; i++)
Run Code Online (Sandbox Code Playgroud)
当只会停止p[i]
是0
.你很幸运,p[5]
碰巧是0
.没有什么可以说它必须如此,它可以像这个例子一样继续前进.只要i >= array size
您访问内存,阵列就不会拥有,您就会进入未定义行为的世界.
如果你0
在数组中有一个像
int inumbers[] = {1 ,2 , 0, 4, 5};
Run Code Online (Sandbox Code Playgroud)
然后该程序将只打印
1
2
Run Code Online (Sandbox Code Playgroud)
并且它不会访问阵列的其余部分.
当一个数组,或者你可以使用一个标准集装箱处理一个远程基于for循环一样
for (const auto & e : inumbers)
std::cout << e << '\n';
Run Code Online (Sandbox Code Playgroud)
迭代它的内容.然后const &
在这种情况下并不真正需要,因为我们正在处理一个int,但是通过引用传递避免复制并使其const
阻止您在执行只读操作时意外修改元素是一个好习惯.
在处理指针时,您需要提供类似的大小
for (int i = 0; i < size_of_pointed_to_array, i++)
std::cout << p[i] << '\n';
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
129 次 |
最近记录: |