在C++; 我是C++初学者,试图通过写尽可能多的各种小程序(程序)来理解我遇到的每一个新概念。 我刚刚编造了以下代码: #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; } #包括 使用名称空间std; int main(){ int inumbers[]={1,2,3,4,5}; int*p; int i; p=个数; 对于(i=0;p[i];i++)cout

在C++; 我是C++初学者,试图通过写尽可能多的各种小程序(程序)来理解我遇到的每一个新概念。 我刚刚编造了以下代码: #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; } #包括 使用名称空间std; int main(){ int inumbers[]={1,2,3,4,5}; int*p; int i; p=个数; 对于(i=0;p[i];i++)cout,c++,C++,,编译器不知道何时停止 for(i = 0; p[i]; i++) 只有当p[i]为0时才会停止。你很幸运,p[5]恰好是0。没有什么说它必须是这样,它可以继续这样运行。只要i>=数组大小你正在访问数组不拥有的内存,你就进入了内存世界 另外,如果数组中有一个0,如 int inumbers[] = {1 ,2 , 0, 4, 5}; 然后程序将只打印 1 2 它不会访问阵列的其余部分 在处理数组或标准容器时,可以使用 你很幸运。很偶然,在inumbers数组中的最后一个元素之后,内存中似乎

,编译器不知道何时停止

for(i = 0; p[i]; i++)
只有当
p[i]
0
时才会停止。你很幸运,
p[5]
恰好是
0
。没有什么说它必须是这样,它可以继续这样运行。只要
i>=数组大小
你正在访问数组不拥有的内存,你就进入了内存世界

另外,如果数组中有一个
0
,如

int inumbers[] = {1 ,2 , 0, 4, 5};
然后程序将只打印

1
2
它不会访问阵列的其余部分

在处理数组或标准容器时,可以使用


你很幸运。很偶然,在
inumbers
数组中的最后一个元素之后,内存中似乎有一个零

您的程序实际上并不正确。相反,您可能希望通过计数数组成员来限制循环:

for(i = 0; i < sizeof(inumbers)/sizeof(int); i++) cout << p[i] << '\n';
for(i=0;ip[i]
的计算结果为false时,循环应该终止,在这种情况下,这意味着
p[i]==0

C++实际上在做什么 显然,您的数组中没有
0
,因此程序会将指针移出数组的边界,并将取消对内存中4个连续字节的引用,并将这4个字节解释为整数,直到找到
0
。在您的情况下,您很幸运内存中存在这样一个
0

如果没有
0
,程序最终将遇到分段错误


一个有趣的实验是在退出循环后打印
i
的值。

上述代码依赖于未定义的行为

特别是,它读取的内容超过了数组的末尾。恰好整数大小的四字节为零(在特定的构建和硬件中)。这会导致循环结束(for
循环的
中间子句读取
,而p[i]为非零


当有未定义的行为时,C++语言不限制运行时的行为。“工作”是一种有效的行为,就像格式化硬盘一样。

你正在重复数组的最后一个成员,超出了界限。其中i为5表示计算结果为false或0。例如,将数组中的第二个值更改为0,并在循环停止时签出。

这是一个运行时决定,而不是编译时决定。循环在
p[i]
计算结果为false时结束,即
p[i]
等于零。由于数组中没有零,因此您读取的内容超出了数组的范围,这当然是不应该的。@Michael Ooh…明白了…是的…那是很明显的!非常感谢!在您养成坏习惯之前,请先阅读,并小心将代码的格式/缩进保持一致。哦,我明白了…是的,这很明显…但是,据我所知,这项技术可以成功地应用于字符串。@Albert,这是因为
char*s=“Albert”
相当于
char s[]={'A','l','b','e','r','t',','\0'};
,即编译器确保分配一个额外的元素并将其设置为null(
'\0'==0
)@Albert它与以null结尾的字符串一起工作。以null结尾的字符串在结尾处有一个
0
,这就是它工作的原因。@CompuChip yap:)这就是我的意思!注意这里的限制是
sizeof(inumbers)/sizeof(int)
,而不是
sizeof(p)/sizeof(int)
。OP将
inumbers
分配给指针
p
;如果此循环在
inumbers
标识符的范围之外使用,则此技术无法工作,尝试使其工作只会导致挫折。@AJNeufeld您是对的。我的目的是在OP的q范围内引入一种限制技术请注意,如果您使用
sizeof(inumbers)/sizeof(inumbers[0])
如果您更改数组的数据类型,那么需要更改的事情就少了一件。@NathanOliver是的,那更好。@NathanOliver使用
sizeof(inumbers)/sizeof(inumbers[0])
在这个意义上更好一些,但它看起来有点难看……我的意思是为什么它是
inumbers[0]
而不是,比如说,
inumbers[1]
(考虑到数组由多个元素组成)…我完全理解为什么…但在我看来,它看起来更难看。你同意吗?事实上,在我问这个问题之前,我用同样的逻辑做了一个类似的实验,它碰巧打印了从0到4的所有数字…我重复了几次,结果都是一样的哈哈,现在我意识到这有多愚蠢…不是吗我知道是什么让我这么做的……我很清楚,像那样的事情可能会很危险。
for (int i = 0; i < size_of_pointed_to_array, i++)
    std::cout << p[i] << '\n';
for(i = 0; i < sizeof(inumbers)/sizeof(int); i++) cout << p[i] << '\n';