Why scanf must take the address of operator
As the title says, I always wonder why scanf
must take the address of
operator (&).
Because C only has "pass-by-value" parameters, so to pass a 'variable' to put a value into, you have to pass its address (or a pointer to the variable).
scanf does not take "the address of operator (&)". It takes a pointer. Most often the pointer to the output variable is gotten by using the address-of operator in the scanf call, e.g.
int i;
scanf("%i", &i);
printf("number is: %d\n", i);
But that is not the only way to do it. The following is just as valid:
int *iPtr = malloc(sizeof(int));
scanf("%i", iPtr);
printf("number is: %d\n", *iPtr);
Likewise we can do the same thing with the following code:
int i;
int *iPtr = &i;
scanf("%i", iPtr);
printf("number is: %d\n", i);
Because it needs the address to place the value it reads. If you declare you variable as a pointer, the scanf
will not need the &
.
Everyone else has described well that sscanf needs to put its output somewhere, but why not return it? Becuase it has to return many things - it can fill in more than one variable (driven by the formatting) and it returns an int indicating how many of those variables it filled in.