本周我的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.
}
答案 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元素。