【发布时间】:2013-11-04 22:24:52
【问题描述】:
我对 C 编程语言非常陌生。现在我正在学习记忆和指针。我正在阅读和阅读,但我不明白何时使用指针,何时不使用。只需查看以下代码即可。在我的第一个代码中,为什么我们不在 "scanf("%2s", card_name)" 这一行上使用 "&" 运算符?在我的第二个代码中,为什么我必须在“scanf("%i", &decks);" 上使用“&”运算符 我整晚都明白了。现在我来这里是为了得到一些很好的提示来理解其中的区别..
代码 1
#include <stdio.h>
#include <stdlib.h>
int main(){
char card_name[3];
int count=0;
while (card_name[0]!='X') {
int val=0;
puts("Enter The Card Name:");
scanf("%2s", card_name);
switch (card_name[0]) {
case 'K':
case 'Q':
case 'J':
val=10;
break;
case 'A':
val=11;
break;
case 'X':
continue;
default:
val= atoi(card_name);
break;
}
if (val<2||val>11) {
puts("sorry this is not valid");
break;
}
if (val>=2&&val<=10) {
count++;
printf("Then value is %i And The Count is %i\n", val, count);
break;
}
}
}
}
代码 2
#include <stdio.h>
int main() {
int decks;
puts("Enter a number of decks");
scanf("%i", &decks);
if (decks < 1) {
puts("That is not a valid number of decks");
return 1; }
printf("There are %i cards\n", (decks * 52));
return 0;
}
【问题讨论】:
-
card_name是一个数组,因此名称 card_name 已经指向一个内存位置,而不是一个“值”。scanf接受输入并将其放在传递的内存地址中。使用int,您需要指定地址,但数组在某种意义上已经是地址。 -
card_name是一个数组。在评估数组表达式时,在大多数但不是所有上下文中,它会隐式转换为指向其第一个元素的指针。请参阅this answer 和comp.lang.c FAQ 的第 6 节。 -
@BenjaminGruenbaum 请不要教初学者数组是地址,因为它是有害的。正确声明“它被隐式转换为指针”应该不需要太多时间。
-
@BenjaminGruenbaum 挑剔正确的术语,正确的术语不是 decay,标准中没有,而是 convert。
-
@BenjaminGruenbaum 标准所说的(强调我的):(C99,6.3.2.1p3)“除非 [...],类型为“类型数组”的表达式是 转换 为类型为“类型指针”的表达式,该表达式指向数组对象的初始元素,并且不是左值。”
标签: c