gpt4 book ai didi

c++ - 如何在for循环中使用指针来统计字符?

转载 作者:太空狗 更新时间:2023-10-29 23:33:49 26 4
gpt4 key购买 nike

我在浏览论坛时看到一个关于计算字符串中每个字母的数量的问题。我正在自学并做了一些研究,现在开始做项目。这里我打印了数组的元素。但是我这样做没有任何指示。我知道我可以使用一个指向数组的指针并让它为每个值递增,但这样做我需要一些帮助。

这是我没有指针的代码:

code main() {
char alph [] = {'a', 'b', 'c'};
int i, o;
o = 0;
for(i=0; i < 3; i++)
{ cout << alph[i] << ' '; };
};

这是我的错误代码,它无法使指针正常工作。

main() {
char alph [] = {'a', 'b', 'c'};
char *p;
p = alph;

for (; p<=3; p++);
cout << *p;

return 0;
};

我希望这个答案不是太明显;我不想浪费任何人的时间。这也是我的第一篇文章,所以如果有人想给我建议,谢谢。

最佳答案

很好的尝试。只有一点点错误,那就是:

p <= 3

指针只是一些代表内存地址的数字。当你做 p = alph , 你没有设置 p0 ,您将其设置为指向与 alph 相同的地址.当用指针遍历数组时,您必须将当前指针与数组末尾后面的指针进行比较。要获得指向数组末尾后一个元素的指针,请将元素数添加到数组中:

alph + 3 // is a pointer to one past the end of the array

然后你的循环变成

for (; p < alph + 3; ++p)

您可能认为获取指向数组末尾的指针会超出数组的范围。但是,您可以随意获取指向内存中任何地方 的指针,只要您不取消引用它即可。自指针alph + 3永远不会取消引用 - 您只将它用作数组末尾的标记 - 一切都很好。

以下是不同版本的一些粗略关联:

/-----------------------------------\
| Pointer Version | Index Version |
-------------------------------------
| p | i |
| p = alph | i = 0 |
| *p | alph[i] |
| alph + 3 | 3 |
| p < alph + 3 | i < 3 |
\-----------------------------------/

另请注意,不要执行 alph + 3 , 你可能想使用 sizeof . sizeof为您提供对象在内存中占用的字节数。对于数组,它会为您提供整个数组占用的字节数(但它不适用于指针,因此您可以使用 alph 而不是 p ,例如)。使用 sizeof 的优势获取数组大小的方法是,如果以后更改大小,则不必去查找所有写alph + 3的地方。并改变它们。你可以这样做:

for (; p < alph + sizeof(alph); ++p)

补充说明:因为char的大小定义为 1字节,这有效。如果将数组更改为 int 的数组,例如(或任何其他大于 1 字节的类型)它将不再工作。为了解决这个问题,您将数组的总大小(以字节为单位)除以单个元素的大小:

for (; p < alph + sizeof(alph) / sizeof(*alph); ++p)

这可能有点难以理解,但您所做的就是将数组的总字节数除以单个元素的大小,以求出数组中的元素数。请注意,您添加的是数组中元素的数量不是数组的字节大小。这是指针算法工作原理的结果(C++ 自动将您添加到指针的数字乘以指针指向的类型的大小)。

例如,如果你有

int alph[3];

然后sizeof(alph) == 12因为每个 int有 4 个字节大。 sizeof(*alph) == 4因为*alph是数组的第一个元素。然后 sizeof(alph) / sizeof(alph)等于12 / 4这是 3 ,这是数组中元素的数量。然后通过做

for (; p < alph + sizeof(alph) / sizeof(*alph); ++p)

相当于

for (; p < alph + 12 / 4; ++p)

相同
for (; p < alph + 3; ++p)

哪个是正确的。

如果您将数组大小更改为 50,这有一个很好的优势。并将类型更改为 short (或类型和数组大小的任何其他组合),代码仍然可以正常工作。

当您变得更高级(并希望对数组的理解足以停止使用它们...)时,您将学习如何使用 std::end为您完成所有这些工作:

for (; p < std::end(alph); ++p)

或者您可以只使用基于范围的 for C++11 中引入的循环:

for (char c : alph)

这更容易。不过,我建议在依赖标准库的便利工具之前先了解指针和指针算法。

干得好,你正确地语法高亮了我的 ASCII-Art-Chart。

关于c++ - 如何在for循环中使用指针来统计字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9091084/

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