WRITING · 文章

C++ 学习日志 #01|循环、累加与指针

ZRonin

学习方向: C++ / 数据结构基础
今日主题: for 循环、嵌套循环、累加、数组与指针

一、偶数统计与求和

今天的第一道练习是计算 1 到 n 之间所有偶数的个数与总和。

最初想到直接让循环变量每次增加 2,以遍历偶数。

#include <iostream>
using namespace std;

int main()
{
    int n;
    int count = 0;
    int sum = 0;

    cin >> n;

    for (int i = 2; i <= n; i += 2)
    {
        count++;
        sum += i;
    }

    cout << "偶数个数:" << count << endl;
    cout << "偶数总和:" << sum << endl;

    return 0;
}

遇到的问题:

最开始将累加语句写成了 sum = +;,这是不完整的表达式。同时,把变量名放在双引号内,导致输出的是文本,而不是变量的值。

理解与收获:

sum += i 等价于 sum = sum + i。累加的本质是读取旧值、计算新值,再将结果保存回变量。

二、嵌套循环:数字三角形

第二道练习要求输出如下数字三角形:

1
12
123
1234
12345

正确实现:

for (int i = 1; i <= n; i++)
{
    for (int k = 1; k <= i; k++)
    {
        cout << k;
    }

    cout << '\n';
}

遇到的问题:

最开始没有理解两层循环变量之间的关系,误把内层循环的判断变量写成了外层的 i。

理解与收获:

外层循环控制行数,内层循环控制每一行的输出次数。

关键是 k <= i。外层每执行一次,内层就会从 k = 1 重新开始执行。

换行语句必须放在内层循环结束之后。

三、指针遍历数组与累加

第三道练习使用指针读取数组元素,并计算总和。

int arr[5] = {10, 20, 30, 40, 50};
int* p = arr;
int sum = 0;

for (int i = 0; i < 5; i++)
{
    cout << *(p + i) << " ";
    sum += *(p + i);
}

cout << "\n总和:" << sum;

输出总和为 150。

遇到的问题:

最开始将循环写成:

for (int i = 1; i <= 5; i++)

这会跳过数组第一个元素,并在最后一次循环中越界。

理解与收获:

  • p 保存内存地址。
  • *p 读取指针指向位置的值。
  • p + i 计算偏移后的地址。
  • *(p + i) 读取偏移位置的元素。

对于具有 n 个元素的数组,有效下标是 0 到 n - 1。

四、移动指针寻找最大值

第四道练习要求使用 p++ 遍历数组,找出最大值。

#include <iostream>
using namespace std;

int main()
{
    int arr[5] = {3, 7, 2, 9, 5};
    int* p = arr;

    int maxValue = *p;

    for (int i = 0; i < 5; i++)
    {
        if (*p > maxValue)
        {
            maxValue = *p;
        }

        p++;
    }

    cout << "最大值:" << maxValue;

    return 0;
}

输出:

最大值:9

遇到的问题:

再次使用了 i <= 5,导致循环执行六次,在最后一次比较中越界读取。

理解与收获:

p++ 会使指针移动到下一个整数元素,而 *(p + i) 只是计算偏移位置并读取,不会改变 p 本身。

对于当前写法,需要先读取 *p,完成比较,再执行 p++。

五、今日总结

今天主要解决了三个理解上的问题。

1. 累加与赋值的区别

sum = i 会覆盖原有值,而 sum += i 会在原值上增加 i。

2. 循环边界

今天两次出现数组越界,说明还需要强化循环次数和数组下标的对应关系。

3. 指针与内存地址

逐步理解了 &、*、指针偏移和 p++,开始能够将指针应用到实际的数组遍历中。

相比单纯阅读概念,独立编写代码更容易暴露理解中的问题。今天四道题都经历了不同程度的修改,也让我意识到,看懂代码与能够独立写出代码仍然存在差距。

六、下一阶段计划

继续强化循环与指针的组合使用,重点练习边界判断、变量更新和数组遍历。之后进入单链表,学习节点创建、next 指针与链表遍历,并尝试独立实现基础链表操作。

学习原则:理解原理 → 独立编写 → 调试纠错 → 总结记录。

评论