【问题标题】:Can I use scanf with pointers?我可以使用带有指针的scanf吗?
【发布时间】:2018-03-29 20:35:43
【问题描述】:

本周我的C语言老师解释说我们可以使用*(array + i)而不是array [i],他还提到了使用这种“新方法”的优点。到目前为止一切都还好,然后他给了我们一些练习要做,其中一个我正在尝试与 scanf 一起使用这种新方法。

我知道该怎么做:

printf("%i", *(array + i));

我的疑问是,我怎样才能在 scanf 中使用 *(array + i),否则不可能?

scanf("%i", *(array + i));


for(i = 0; i < size; i++)
{

    printf("Insert number: %i", i+1);
    scanf("%i", *(array + i); // it's not working.

}

【问题讨论】:

  • 您知道 scanf 需要一个指针指向您现在提供取消引用指针的位置,不是吗?
  • 取消引用
  • 除了知道您当前问题的答案之外,请确保您了解为什么 *(array+i)array[i] 是一回事。他们都在执行pointer arithmeticarray[i] 语法只是包含了取消引用。
  • scanf("%i", *(array + i); 甚至不会编译给定不平衡的()。发布真实代码是提出问题的良好第一步。
  • 你试过了吗?发生了什么? :)

标签: c pointers scanf


【解决方案1】:

scanf 的参数必须是指向要存储结果的变量的指针,因此不应取消引用它:

scanf("%i", array+i);

这与您在printf()scanf() 中处理普通变量的方式完全相反:

printf("%i", var);
scanf("%i", &var);

添加&amp; 类似于删除*

【讨论】:

    【解决方案2】:
    *(array + i) ==  array[i]
      array + i  == &array[i]
    

    这意味着:

    printf( "%i", array[i] ) == printf( "%i", *(array + i) );
    scanf( "%i", &array[i] ) == scanf( "%i", array + i );
    

    他还提到了使用这种“新方法”的好处

    这些会有什么优势?以我的经验,使用*(a + i) 而不是a[i] 往往会导致代码不太清晰,并且更容易出错。

    【讨论】:

    • 例如,他说这种方法比其他方法运行得快……我不记得确切原因,但他说的是。老实说,我认为这种新方法更难,也没有必要……但我必须用它做功课。
    • 感谢@John Bode
    • @LelreFerreira:呃。下次他说这样的话时,请他(礼貌地!)展示他如何衡量绩效提升以及提升幅度有多大。在需要几毫秒 (I/O) 的任务上保存一个时钟周期是没有意义的
    【解决方案3】:

    在 C 中,a[i] 实际上被翻译成*(a+i);它叫syntactic sugar

    数组使用其变量名引用,单个数组元素引用为起始地址+(元素位置*每个元素的大小)

    正如Barmar's Answer 中提到的 - 你应该使用

    a+i 而不是*(a+i)

    因为 scanf 函数需要一个地址作为参数来存储输入,而不是取消引用的值

    【讨论】:

      【解决方案4】:

      确实,您必须将scanf(3) 与指针一起使用,因为它不允许传递非指针值。但是你不能做的(除非最终指向的值也是一个指针)是将它们与取消引用的指针一起使用(在你的例子中确实做了什么,当你写*(array + i)) 例如,如果你想使用指针,可以传递 array + i,这是一个完全有效的指针,它指向 arrayi-esim 元素。

      【讨论】:

        猜你喜欢
        • 2016-11-03
        • 2013-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 2014-11-30
        相关资源
        最近更新 更多