仅使用指针的输入数组

Input array using only pointers

我有一个练习告诉我只使用指针将元素输入到数组中。 于是在WEB中寻找解决方案(https://codeforwin.org/2017/11/c-program-input-print-array-elements-using-pointers.html)

#include <stdio.h>

#define MAX_SIZE 100 // Maximum array size

int main()
{
    int arr[MAX_SIZE];
    int N, i;
    int * ptr = arr;    // Pointer to arr[0] 

    printf("Enter size of array: ");
    scanf("%d", &N);

    printf("Enter elements in array:\n");
    for (i = 0; i < N; i++)
    {
        scanf("%d", ptr);

        // Move pointer to next array element
        ptr++;   
    }

    // Make sure that pointer again points back to first array element
    ptr = arr;

    printf("Array elements: ");
    for (i = 0; i < N; i++)
    {
        // Print value pointed by the pointer
        printf("%d, ", *ptr);

        // Move pointer to next array element
        ptr++;
    }

    return 0;
}

我无法理解这一行:

 for (i = 0; i < N; i++)
    {
        scanf("%d", ptr);

        // Move pointer to next array element
        ptr++;   
    }

为什么我们使用 ptr 而不用 (*ptr) 取消引用它。 ptr 是自 ptr = arr 以来的地址。当我们使用 scanf 时,我们输入的是一个值(int 或 double 或 float)而不是地址,那么为什么没有 * 的指针?

谢谢。

Why do we use ptr without dereferencing it with (*ptr).

我们正在传递 scanf 指向内存的指针,用于写入从键盘获取的 int。取消引用就是我们自己跟随那个指针,这无助于 scanf 知道在哪里写入值。

When we use scanf we type in a value (int or double or float) and not an address so why's that ptr without * ?

&N中的&是address-of运算符,意思是“让我成为指向N的指针”。你可以写 int *N_ptr = &N; 然后 scanf("%d", N_ptr); 如果这样更清楚。

还有一件事:在 C 中传递 arguments/parameters 是通过复制完成的。含义:

void some_function(int i) {
  printf("%p\n", &i);
}
int main(void) {
  int i;
  printf("%p\n", &i);
  some_function(i);
}

这样可以保证打印出两个不同的指针值。内存中必须有两个 int,因为如果 some_function 修改了 i,那不会修改调用者中的 i。这就是为什么 scanf 不能只使用 address-of 自身来获取原始地址:它只会获取它收到的副本的地址,并且该副本在调用者可以读取它之前就已经消失了。