为什么 scanf 不需要字符串的 & 符号,并且在 printf(在 C 中)也能正常工作?

Why doesn't scanf need an ampersand for strings and also works fine in printf (in C)?

提问人:Adam 提问时间:12/19/2009 更新时间:11/7/2023 访问量:11904

问:

我现在正在学习 C 语言中的字符串。

如何使用scanf来获取字符串,你可以这样做

scanf("%s",str1);

对于 printf,您可以这样做

printf("The string is %s\n", str1);

我知道对于 scanf 来说,这是因为字符串只是一个字符数组,它是一个指针,但对于 printf,你怎么能像对待 int 或 float 一样放置变量名称?

c 字符串 指针 printf scanf

评论


答:

10赞 GManNickG 12/19/2009 #1

scanf需要要读入的变量的地址,并且字符串缓冲区已经表示为地址(指向内存中某个位置的指针,或衰减为指针的数组)。

printf执行相同的操作,将其视为指向字符串的指针。%s

6赞 Steve Emmerson 12/19/2009 #2

在 C 语言中,作为数组的变量在用作函数参数时会成为指向数组第一个元素的指针——因此 scanf() 会看到指向内存的指针(假设“str1”是一个数组)。

在 printf() 中,“str1”可以是指向字符串的指针,也可以是指向字符数组的指针(在这种情况下,printf() 看到的参数将是指向数组第一个元素的指针)。

评论

1赞 Keith Thompson 1/19/2012
更准确地说,数组类型的表达式在大多数(但不是所有)上下文中被隐式转换(“衰减”)为指向数组第一个元素的指针。函数参数恰好是发生转换的上下文之一。