2

私はCプログラミング言語が初めてです。今、私はメモリとポインタを学んでいます。私は読んだり読んだりしていますが、ポインターをいつ使用し、いつ使用しないか理解していません。以下を参照してコーディングしてください。最初のコードで、この行 "scanf("%2s", card_name)" で "&" 演算子を使用しないのはなぜですか? 2 番目のコードでは、「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

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 に答える