gpt4 book ai didi

c++ - 使用指针循环遍历数组

转载 作者:行者123 更新时间:2023-12-01 14:31:06 28 4
gpt4 key购买 nike

以下 C++ 程序打印的输出比我预期的要多。谁能解释为什么会这样?该程序尝试使用指针循环遍历整数数组,沿途打印每个值。

#include <cstdio>
using namespace std;

int main(int argc, char **argv) {
puts("hi");
int ia[5] = {1,2,3,4,5};
for (int *p = ia; *p; ++p) {
printf("Char is: %d\n", *p);
}
return 0;
}

/*
hi
Char is: 1
Char is: 2
Char is: 3
Char is: 4
Char is: 5
Char is: 32767
Char is: -811990796
Char is: -133728064
Char is: 1606416320
Char is: 32767
Char is: -1052593579
Char is: 32767
Program ended with exit code: 0
*/

最佳答案

您需要有一个 0/​​NULL 值才能停止,目前您不需要。

您的循环条件将允许迭代,直到您得到一个评估为假的值(即 0)并且您的数组不包含该值,因此您的迭代将继续超过数组的边界,并在访问某些内存时在某个时候退出它不应该。

有几种方法可以修复它。您可以在数组末尾添加 0。

#include <cstdio>
using namespace std;

int main(int argc, char **argv) {
puts("hi");
int ia[] = {1,2,3,4,5, 0};
for (int *p = ia; *p; ++p) {
printf("Char is: %d\n", *p);
}
return 0;
}

问题在于您现在不能在数组中使用 0,否则它将提前终止。

给定数组长度,更好的方法是预先计算停止的地址。该地址位于数组末尾。
#include <cstdio>
using namespace std;

int main(int argc, char **argv) {
puts("hi");
int ia[] = {1,2,3,4,5};
int* end = ia + 5;
for (int *p = ia; p != end; ++p) {
printf("Char is: %d\n", *p);
}
return 0;
}

现在我们正在研究标准库迭代器使用的方法。现在模板可以推断数组的大小。

IE。
#include <iterator>
...

for (auto it = std::begin(ia); it != std::end(ia); ++it) {
printf("Char is: %d\n", *it);
}

...

最后,基于范围的 for 也支持数组。
for (auto i: ia)
{
/* do something */
}

关于c++ - 使用指针循环遍历数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41687921/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com