2

我对 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; 
}
4

2 回答 2

6

您偶然发现的可能是关于 C 语言最微妙的事情:数组标识符衰减为指针的事实。当你写

char card_name[3];

您定义了一个由三个字符组成的数组。这很容易,类型card_name写为char ()[3].

难以掌握的部分是,card_name几乎在所有上下文中,它都会衰减为指向该数组第一个元素的指针,因此几乎所有提及的类型card_name都是char*. 几乎就好像地址获取运算符被隐含地应用于数组名称的任何提及。因此,当您传递card_name到时scanf(),实际上是在传递一个指向其第一个元素的指针,并scanf()使用该指针来存储名称。

另一方面,当你对整数做同样的事情时,就没有指针衰减这样的事情了。代码的行为与您期望的完全一样,每当您使用名称时,decks您都会获得整数的,而不仅仅是它的地址。这就是为什么你必须明确地从decks.

于 2013-11-04T22:35:19.350 回答
1

尝试理解间接的指针级别。Scanf 总是将 1 级指针作为参数。

数组声明如下:

char name[4];

name 是 1 级对象。当作为参数传递时,数组衰减为指针:

void f(char* name) { ... }

其他 1 级对象:

int* p1;
double* d1;

这些是 2 级对象:

int** p2;
double** d2;

和 0 级:

int p0;
double d0;

因此,级别是声明中的星数(或 [])。这可以通过使用 * 和 & 在代码中进行修改。* 取消引用指针并将级别降低 1。但 & 则相反 - 它将级别增加 1。

所以使用上面的scanf,我们将有:

scanf("%i%i%i", &p0, p1, *p2);
scanf("%lf%lf%lf", &d0, d1, *d2);

其中 &p0 是级别 0 + 1,对于 & 总共 1 p1 已经是 1 *p2 是级别 2 - 1 对于 * 总共 1

于 2013-11-04T22:43:57.247 回答