在C++中索引整数指针

Alb*_*ert 4 c++

我是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)

  • @Albert,那是因为`char*s ="Albert";`相当于`char s [] = {'A','l','b','e','r','t', '\ 0'};`,_ i.e._编译器确保分配一个额外的元素并将其设置为null(''\ 0'== 0`). (2认同)
  • @Albert它使用空终止字符串.一个以null结尾的字符串在那时有一个"0",这就是它工作的原因. (2认同)