我可以使用带指针的scanf吗?

时间:2018-03-29 20:35:43

标签: c pointers scanf

本周我的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.

}

4 个答案:

答案 0 :(得分:4)

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

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

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

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

添加&类似于删除*

答案 1 :(得分: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]往往导致代码不太清晰,更容易出错。

答案 2 :(得分:0)

在C中,a[i]实际上已转换为*(a+i);它被称为syntactic sugar

使用变量名称引用数组,并将各个数组元素作为起始地址+(元素位置*每个元素的大小)引用

Barmar's Answer中所述 - 您应该使用

a+i代替*(a+i)

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

答案 3 :(得分:0)

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