使用指针输入结构值时,scanf函数混淆

时间:2016-10-07 15:20:04

标签: c

#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

1 个答案:

答案 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标准的规则自动派生的。

也相关:http://c-faq.com/aryptr/aryvsadr.html