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

Ada*_*dam 8 c string printf pointers scanf

我现在正在学习C中的字符串.

如何使用scanf来获取你可以做的字符串

scanf("%s",str1);
Run Code Online (Sandbox Code Playgroud)

而对于printf,你可以做到

printf("The string is %s\n", str1);
Run Code Online (Sandbox Code Playgroud)

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

GMa*_*ckG 10

scanf 需要读入变量的地址,字符串缓冲区已经表示为地址(指向内存中位置的指针,或者分解为指针的数组).

printf做同样的事情,%s视为指向字符串的指针.


Ste*_*son 5

在C中,当用作函数参数时,作为数组的变量成为指向数组的第一个元素的指针 - 因此scanf()会看到指向内存的指针(假设"str1"是一个数组).

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