#include <stdio.h>
struct invent
{
char name[20];
int number;
float price;
};
int main()
{
char ch;
struct invent product[3],*ptr;
printf("INPUT\n\n");
for(ptr=product;ptr<product+3;ptr++)
scanf("%s %d %f",ptr->name,&ptr->number,&ptr->price);
printf("\nOUTPUT\n\n");
ptr=product;
while(ptr<product+3)
{
printf("%20s %5d %10.2f\n",ptr->name,ptr->number,ptr->price);
ptr++;
}
return 0;
}
为什么在输入数字和价格scanf
时使用ptr->name
仅输入名称&ptr->number
的功能,使用&ptr->price
。我想问为什么我们使用&
因为ptr
本身存储了结构的地址。这是另一个解释
int main()
{
int a,*p;
p=&a;
scanf("%d",p);
printf("%d",a);
return 0;
}
在上面的代码中,我们没有在&p
函数中使用scanf
,因为p
本身存储了a
的地址,所以为什么要使用&ptr->number
和结构&ptr->price
。
答案 0 :(得分:2)
为什么在scanf函数中输入名称仅使用ptr-&gt; name 输入数字和价格&amp; ptr-&gt;数字,&amp; ptr-&gt;价格
因为ptr->name
是一个数组,并且数组的名称在表达式中被转换为指向其第一个元素的指针。因此,在将其传递给scanf()并使用&
时,使用&ptr->name
(地址)是错误的。
但是其他标量类型没有这样的&#34;衰变&#34;属性。因此,使用了&
。
请参阅:What is array decaying?
在你的第二个程序中,p
已经是一个指针。因此,传递&p
将为int**
,而scanf()
则需要int*
格式说明符%d
。
基本上,在这两种情况下,您都需要传递指针(char*
的{{1}}和%s
的{{1}}。但是对于数组,指针是根据C标准的规则自动派生的。