scanf和printf什么时候用&?

int n,i,h,m;
char a[10];
scanf("%d",&n);
for
(i=0;i<n;i++)
{
scanf("%s%d%d",&a[i],&h,&m);
if((h<15||h>20)||(m<50||m>70))
printf("%s\n",&a[i]);
}
为什么这个程序里printf也要加&才能运行成功啊
要不然就是scanf不加&才能运行成功

这几个 & 是求地址运算符号。
普通变量,例如 int, float, double , 语句中的变量名,表示 变量的值,加上 & 才是地址。
字符串变量不同于上述普通变量,它用 char 数组表示,例如 char a[10]。 变量的名字 a , 表示的是字符串的首地址。
输入语句scanf 是有格式输入,输入参数都要用 变量的地址。
例如:scanf("%s%d%d",a, &h, &m); 这里的a 是 char a[10] 的首地址,等于 首字符 a[0] 的 地址 &a[0].
输入语句printf() 是有格式输出,普通变量,输出参数都要用 变量的值表示,字符串输出格式%s, 对应的参数 却是要用 输出字符串的首地址表示。
例如: printf("%s %d %d\n", a, h, m);
你的 printf("%s\n",&a[i]); 这里 &a[i] 意思是 输出字符串的首地址 是 &a[i], 也就是从 char a[10] 中 第 i 个 字符 开始输出。
例如: char a[10]="ABCDEFG";
printf("%s\n",a); 输出ABCDEFG
i=3; printf("%s\n", &a[i]); 输出 DEFG
printf("%c\n", a[i]); 输出 D
i=4; printf("%s\n", &a[i]); 输出 EFG
printf("%c\n", a[i]); 输出 E
注意,记住 与 %s 格式 有关的输入输出 比较 特殊,输入输出都要用字符串地址。
若是 %c 格式,那么 就要按普通 字符变量 对待。 不要混淆 “字符串”与 “字符”的概念。追问

“注意,记住 与 %s 格式 有关的输入输出 比较 特殊,输入输出都要用字符串地址。”
这句话是在一维数组中适用吗?我看了这一题的另一个答案,是用二维数组做的,他最后的printf里直接是a[i]没有加&。
刚开始学,不太懂,麻烦了

“注意,记住 与 %s 格式 有关的输入输出 比较 特殊,输入输出都要用字符串地址。”
这句话是在一维数组中适用吗?我看了这一题的另一个答案,是用二维数组做的,他最后的printf里直接是a[i]没有加&。
刚开始学,不太懂,麻烦了

追答

二维数组,不同于一维数组,例如二维: char a[10][20]; 它可以存放10行20列单个字符,也
可以存10个字符串,每个字符串存19个字符和一个结束符。 语句中 a[i] 就是第i 个字符串的首地址,printf("%s",a[i]); 输出 第 i 个字符串。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-10-23

因为printf("%s\n",&a[i]);要显示的是字符串,需要字符串所在的地址,而a[i]是字符类型,所以要加&来取得a[i]的地址。不用&的话,可以改为a+i,即printf("%s\n",a+i);

第2个回答  2021-12-06
数字和字符连续的变量,scanf输入变量时,必须加&,因为它需要变量的地址。printf输出时不需要加&,因为它不需要地址。
字符串变量,输入和输出时,都需要地址。所以都应该需要&,但因为数组名就代表地址,所以,只写变量名时,就不需要加&了,但如果写元素名,就要加&了。
第3个回答  2021-10-23
在scanf函数中读取整数、浮点数、单个字符时,相应的变量前要使用取地址符&。在scanf函数中使用%s读取字符串时,不用&的。在printf中,全部不使用&的。
第4个回答  2021-12-27
在输出的时候用&这个符号,scanf用户提示用户输入,printf用于计算后输出信息。
相似回答