如何在for循环中使用指针来计算字符?

Pat*_*edy 2 c++

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

这是我没有指针的代码:

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

这是我的错误代码,无法使指针工作.

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

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

    return 0;
};
Run Code Online (Sandbox Code Playgroud)

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

Set*_*gie 8

非常好的尝试.只有一个小问题,这是:

p <= 3
Run Code Online (Sandbox Code Playgroud)

指针只是一个代表内存地址的数字.当你这样做p = alph,你不设置p0,你将它设置为指向相同的地址alph.使用指针循环数组时,必须将当前指针与超出数组末尾的指针进行比较.要获得指向超出数组末尾的一个元素的指针,可以向数组中添加元素数:

alph + 3 // is a pointer to one past the end of the array
Run Code Online (Sandbox Code Playgroud)

然后你的循环变成了

for (; p < alph + 3; ++p)
Run Code Online (Sandbox Code Playgroud)

您可能会认为获取指向数组末尾的指针超出了数组的范围.但是,只要不取消引用它,就可以自由地获取指向内存中任何位置的指针.由于指针alph + 3永远不会被解引用 - 你只能将它用作数组末尾的标记 - 一切都很好.

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

/-----------------------------------\
| Pointer Version |   Index Version |
-------------------------------------
|  p              |              i  |
|  p = alph       |          i = 0  |
|  *p             |        alph[i]  |
|  alph + 3       |              3  |
|  p < alph + 3   |          i < 3  |
\-----------------------------------/
Run Code Online (Sandbox Code Playgroud)

另请注意alph + 3,您可能不想这样做sizeof.sizeof为您提供对象在内存中占用的字节数.对于数组,它给出了整个数组占用的字节数(但它不适用于指针,因此你可以使用,alph但不能使用p,例如).使用sizeof获取数组大小的优点是,如果稍后更改大小,则不必去查找编写的所有位置alph + 3并更改它们.你可以这样做:

for (; p < alph + sizeof(alph); ++p)
Run Code Online (Sandbox Code Playgroud)

附加说明:因为大小char定义为1字节,这是有效的.例如,如果将数组更改为数组int(或任何其他大于1个字节的类型),则它将不再起作用.要解决此问题,可以将数组的总大小(以字节为单位)除以单个元素的大小:

for (; p < alph + sizeof(alph) / sizeof(*alph); ++p)
Run Code Online (Sandbox Code Playgroud)

理解这可能有点复杂,但您所做的只是获取数组的总字节数并将其除以单个元素的大小以查找数组中的元素数.请注意,您要添加数组中的元素数,而不是 数组的字节大小.这是指针运算如何工作的结果(C++自动将您添加到指针的数字乘以指针指向的类型的大小).

例如,如果你有

int alph[3];
Run Code Online (Sandbox Code Playgroud)

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

for (; p < alph + sizeof(alph) / sizeof(*alph); ++p)
Run Code Online (Sandbox Code Playgroud)

这相当于

for (; p < alph + 12 / 4; ++p)
Run Code Online (Sandbox Code Playgroud)

这是一样的

for (; p < alph + 3; ++p)
Run Code Online (Sandbox Code Playgroud)

哪个是对的.

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

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

for (; p < std::end(alph); ++p)
Run Code Online (Sandbox Code Playgroud)

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

for (char c : alph)
Run Code Online (Sandbox Code Playgroud)

哪个更容易.我建议在使用标准库的方便工具之前很好地理解指针和指针算法.

同样好的工作,你正确的语法突出我的ASCII艺术图表.