Search code examples
cpointersscanfampersand

Ampersand(&) and scanf in C?


I have the following multiple-choice question and I cannot figure out why (A) and (C) are incorrect, any explanation would be appreciated! The only correct answer in the following question is (B).

Which of the following is a correct usage of scanf?
(A) int i=0; scanf("%d", i);
(B) int i=0; int *p=&i; scanf("%d", p);
(C) char *s="1234567"; scanf("%3s", &s);
(D) char c; scanf("%c", c);


Solution

  • scanf wants a correct address where to store the result:

    (A) int i=0; scanf("%d", i);
    

    i is passed here by value, no address: wrong.

    (B) int i=0; int *p=&i; scanf("%d", p);
    

    p is a pointer to int, scanf can store its result here: right

    (C) char *s="1234567"; scanf("%3s", &s);
    

    &s is the address of a pointer to char *, you cannot store a string there: wrong

    (D) char c; scanf("%c", c);
    

    c is passed by value, not an address: wrong