Reputation: 557
#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;
}
Why in scanf
function for entering name only ptr->name
is used while entering number and price &ptr->number
, &ptr->price
is used. I want to ask why we are using &
at all because ptr
is itself storing the address of structure. Here is another code to explain
int main()
{
int a,*p;
p=&a;
scanf("%d",p);
printf("%d",a);
return 0;
}
In the above code we are not using &p
in scanf
function because p
is itself storing the address of a
, so why use &ptr->number
and &ptr->price
for structures.
Upvotes: 3
Views: 281
Reputation: 121387
Why in scanf function for entering name only ptr->name is used while entering number and price &ptr->number,&ptr->price
Because ptr->name
is an array and an array's name, in an expression, gets converted into a pointer to its first element. Hence, there's no &
(address-of) used when passing it to scanf() and using &ptr->name
would be wrong.
But other scalar types don't have such "decaying" property. Hence, &
is used.
See: What is array decaying?
In your second program, p
is already a pointer. So, passing &p
would be int**
whereas scanf()
expects an int*
for the format specifier %d
.
Basically, in both cases you are required to pass pointers (char*
for %s
and int*
for %d
). But in the case of arrays, the pointer is automagically derived as per the rules of the C standard.
Also relevant: http://c-faq.com/aryptr/aryvsadr.html
Upvotes: 2