&符号(&)和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
按值传递,而不是地址:错误
您必须传递一个指向该函数的指针,以便它知道存储该值的内存位置。 如果您只是按值传递,它会将其视为内存地址,并且所有地狱都会破坏。 因此,您使用&
来获取变量的引用 (即内存地址)。
这就是A和D错误的原因。
至于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