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

时间:2016-12-08 08:33:06

标签: c pointers scanf ampersand

我有以下多项选择题,我无法弄清楚为什么(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);

5 个答案:

答案 0 :(得分:4)

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

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

i按值传递,没有地址:错误。

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

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

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

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

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

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

答案 1 :(得分:2)

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

A D 错误的原因。

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

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

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

答案 2 :(得分:1)

了解这一点:

  

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

扩展:i变量的地址是什么?对于那个& operator给出i变量的地址。 scanf()获取用户输入并将值存储在该地址上。

  

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

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

答案 3 :(得分:0)

对于A:

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

这应该是:

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

查看scanf()

signature

答案 4 :(得分:0)

带有scanf说明符的

%d将输入作为要扫描的位置的地址。

使用1.您输入的内容为i,这是错误的

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

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

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