&符号(&)和C中的scanf?

我有以下多项选择题,我无法弄清楚为什么(A)和(C)不正确,任何解释都将不胜感激! 以下问题中唯一正确的答案是(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); 

scanf想要一个正确的地址来存储结果:

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

i是按价值传递给这里的,没有地址:错误。

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

p是指向int的指针, scanf可以在此处存储其结果:right

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

&s是指向char *的指针的地址,你不能在那里存储一个字符串:错误

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

c按值传递,而不是地址:错误

您必须传递一个指向该函数的指针,以便它知道存储该值的内存位置。 如果您只是按值传递,它会将其视为内存地址,并且所有地狱都会破坏。 因此,您使用&来获取变量的引用 (即内存地址)。

这就是AD错误的原因。

至于C ,它看起来是正确的,因为你提供了一个指针,但实际上你正在引用那个指针。 因此scanf将在指针本身上写入,而不是它指向的内存。

如果你刚刚提供了s ,那么我们就会进入另一个禁区。 指针指向您不允许修改的字符串文字 。 但是,如果它不是文字而是使用文字作为初始化程序的数组, 那么没关系,只要你没有读取的数据超过它可以存储的数据:

 char s[] = "1234567"; scanf("%3s", s); /* this is okay */ 

了解这个:

int i = 0; scanf(“%d”,i);

扩展:i变量的地址是什么? 因为&运算符给出了i变量的地址。 scanf()获取用户输入并将值存储在该地址上。

char * s =“1234567”; scanf(“%3s”,&s);

说明:在这种情况下,您将字符串分配给字符指针,并且位于代码部分。 这个选项的主要目的是我们不能修改代码部分。 但在这种情况下,我们正在修改指针。 所以在该指针指向新分配的地址之后,它可能会输入错误的地址,然后得到分段错误。 所以我们丢失以前分配的字符串

为一个:

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

这应该是:

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

看看scanf()的签名

具有指定符%d scanf将输入作为要扫描的位置的地址。

使用1.你输入的输入是错误的

使用2.您将输入作为p ,其地址为i 。这在初始化期间设置为int *p=&i 。 所以这是正确的。

使用3.说明符是%s 。 这需要输入开始存储字符串的地址。 s的输入是一个数组,已包含地址。 &s错了。

使用4.您正在使用%c说明符,它也获取该位置的地址。 因此,在这种情况下输入c是错误的,以获得所需位置的地址&c