在这个特定程序中,int i 在 for 循环(在 scanf 和 sum 中)中做了什么?

What does int i do inside of the for loop(in scanf and sum) in this particular program?

scanf里的isum里的i不是没用吗?它没有任何改变,即使我打印 &ptr 它也没有显示内存值有任何差异。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n, *ptr, sum = 0;

    printf("Enter number of elements: ");
    scanf("%d", &n);

    ptr = (int *)malloc(n * sizeof(int));

    // if memory cannot be allocated
    if (ptr == NULL) {
        printf("Error! memory not allocated.");
        exit(0);
    }

    printf("Enter elements: ");
    for (int i = 0; i < n; ++i) {
        scanf("%d", ptr + i);
        sum = sum + *(ptr + i);
    }

    printf("Sum = %d", sum);

    // deallocating the memory
    free(ptr);

    return 0;
}

'i' 不应该更改指针。它用于访问 PTR 指向的数组的第 i 个元素。没有 I 它会扫描这个数组中的相同元素,第一个元素

'i' 不是无用的值,它用于偏移指针以访问动态数组的正确元素。

和使用

一样
for (int i = 0; i < n; ++i) {
        scanf("%d", &ptr[i]);
        sum = sum + ptr[i];
    }

"What does int i do inside of the for loop?"

i用于访问动态分配内存的后续int对象的指针偏移。

它的工作原理是:

(value of ptr [address of pointed object by ptr] + (i * sizeof(pointed object by ptr))).

也许看看 this 堆栈溢出问题。

注意:目的只是取消引用和修改指向的对象,而不是指针本身。 ptr 不会因为这个指针算法而改变。

"It doesn't change anything, even when I print &ptr it doesn't show me any difference in memory values."

可能它不会显示不同的值,因为您打印指针本身的地址,它不会通过使用指针的偏移量而改变。

我说“可能”是因为我看不出你是如何打印出 ptr 的地址的。也许你甚至有某种未定义的行为。

索引ifor中的作用有两个:

  • 确保 n 个数字在 sum 中被读取和累积。
  • 将每个转换后的数字存储到 ptr 指向的数组中的单独条目中。

鉴于程序的作用,不需要将数字存储到数组中,甚至不需要分配这个数组。

这是一个更简单的版本:

#include <stdio.h>

int main() {
    int n, v, sum = 0;

    printf("Enter number of elements: ");
    if (scanf("%d", &n) != 1)
        return 1;

    printf("Enter elements: ");
    for (int i = 0; i < n; i++) {
        if (scanf("%d", &v) != 1) {
            printf("input error\n");
            break;
        }
        sum = sum + v;
    }
    printf("Sum = %d\n", sum);
    return 0;
}

如果您不在 sum 和 scanf 中使用 'i',则不会对 sum 产生任何影响,因为它将在动态内存的第一个索引中获取输入并覆盖它。 'i' 有助于将输入存储在动态内存中。