【问题标题】:Input array using only pointers仅使用指针的输入数组
【发布时间】:2022-01-25 05:55:26
【问题描述】:

我有一个练习告诉我只使用指针将元素输入到数组中。 于是我在 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)而不是地址,那么为什么那个指针没有*

谢谢。

【问题讨论】:

  • "当我们使用 scanf 时,我们输入一个值(int 或 double 或 float)而不是地址" 不,我们没有。 scanf 的参数是指针。这是您代码前面的内容:scanf("%d", &amp;N);

标签: c pointers input dereference


【解决方案1】:

为什么我们使用 ptr 而不用 (*ptr) 解引用它。

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

当我们使用 scanf 时,我们输入一个值(int 或 double 或 float)而不是地址,那为什么 ptr 没有 * ?

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

另一件事:在 C 中传递参数/参数是通过复制完成的。含义:

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

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

【讨论】:

  • 谢谢你的解释,一清二楚。
  • @MarouaneSharry,如果您认为这已令人满意地回答了您的问题,您可以通过单击复选标记将其选为 答案。这样做会让你获得 2 点声望。
猜你喜欢
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
相关资源
最近更新 更多