web-dev-qa-db-ja.com

scanf()でアンパサンドを使用する場合

scanf()の使用中にcでアンパサンドを使用するためのルールは何ですか?

struct Student 
{
  char name[20];
  int id;
};

int main(void)
{
  struct Student std1;
  printf("enter name and id of std1\n");
  scanf("%s %d", std1.name, &(std1.id));
}

なぜ文字列ではアンパサンドを使用する必要がなく、intにはアンパサンドを使用する必要があるのですか?

アンパサンド記号をいつ使用するかに関するルールはありますか?

18
Dkova

scanfは特定のタイプのデータを、second、thrid、fouthなどの引数として渡されるアドレスに読み込みます...

int var;

ここで、varは値、&varはアドレスです

scanf("%d",&var);

上記のステートメントは、==>%d(整数)タイプのデータを&varアドレスに読み取ります


char s[20];

ここで、sは値ではなくアドレスです。ここでsは文字配列です(文字列と呼ばれます)。

アレイ名自体がそのアドレスを示します。 s ==&s [0]、これらは両方とも同じです。

scanf("%s",s);

上記のステートメントは、==>%s(文字の配列)タイプのデータをsから始まるアドレス位置に読み取ります。


int a[20];

このコードを参照してください

#include<stdio.h>
#define MAX 5

  main()
    {
        int a[MAX];
        int i;
        printf("Enter Values of array\n");
        for(i=0;i<MAX;i++)
        {
                printf("Enter a[%d] =  ",i);
                scanf("%d",&a[i]); // reading each time single integer value starting index with 0 and ending index MAX-1.
        }

     }

Cでは、%sを使用して一度に文字のグループをスキャンするような、整数のグループを一度にスキャンする単一のフォーマット指定子はありませんでした。

そしてここでa =&a [0];

単一の整数値を、aが指すアドレスに直接スキャンできます。

scanf("%d",a);

printf("a[0]=%d\n",a[0]);

10と入力すると、これはa [0] = 10と出力されます。

ポインタの使用法:

以下に示すようにポインタを使用すると、気が付くでしょう。ポインタをインクリメントし、配列の別の場所に値を取得する方法。

ポインタの位置を移動して配列を読み取ることができます。ポインタの位置を移動せずに配列を読み取ることができます。

1.ポインタの位置を移動して配列を読み取る

    #include<stdio.h>
    #define MAX 5

      main()
        {
            int a[MAX];
            int i;
            int *ptr;
            ptr = &a[0];
            printf("Enter Values of array\n");
               for(i=0;i<MAX;i++)
                    {
                    printf("Enter a[%d] =  ",i);
                    scanf("%d",ptr);
                    ptr++; //moving pointer 
                    }

        }

2.ポインタの位置を移動せずに配列を読み取る

#include<stdio.h>
#define MAX 5

  main()
    {
        int a[MAX];
        int i;
        int *ptr;
        ptr = &a[0];
        printf("Enter Values of array\n");
           for(i=0;i<MAX;i++)
                {
                printf("Enter a[%d] =  ",i);
                scanf("%d",ptr+i); //we are not moving ptr position we scaning each time into next location by incrementing i 
                }

    }

ポインタがインクリメントされると、インクリメントはポインタのタイプに依存します。ここで、ptrは整数ポインターなので、ptr + 1はptr + sizeof(int)の位置を増分します。


int a[5][5];

これは2次元配列なので、スキャンするにはここに5つのポインターが必要なので、ポインター配列と宣言しました。

#include<stdio.h>
#define MAX 5

  main()
    {
    int a[MAX][MAX],i,j;
    int *pointer[MAX];

    for(i=0;i<MAX;i++)
    pointer[i]=&a[i][0]; //initializes the pointers 

    printf("Enter elements :\n");
    for(i=0;i< MAX;i++)
        {   
        for(j=0;j<MAX;j++)
            {

            printf("Enter the a[%d][%d] element: ",i,j);
            scanf("%d",pointer[i]+j); //each time you will move like 00 01 02 03 04 and second time 10 11 12 13 14 and so on...
            //printf("%u or %x",pointer[i]+j,pointer[i]+j);//un comment this line and see the addresses how the address incrementing for each element
            }
        }

    printf("The Given Matrix:\n\n");
    for(i=0;i<MAX;i++)
                {
                for(j=0;j<MAX;j++)
                        {
                        printf("%d",*(pointer[i]+j));
                        printf("\t\t");
            }
        printf("\n\n");
                }

    }

直接スキャン

    printf("Enter elements :\n");
    for(i=0;i< MAX;i++)
        {   
        for(j=0;j<MAX;j++)
            {

            printf("Enter the a[%d][%d] element: ",i,j);
            scanf("%d",&a[i][j]); //we can't do like this a++ or ++a or a+i this is illegal in C. for that purpose we are using pointers  
            }
        }

あなたは、以下の本で上記のもののほとんどを見つけるでしょう。

このリンクにアクセスしてください:ウィキを読んで
Cプログラミング言語(第2版)-Brian W. KernighanおよびDennis M. Ritchie

25
Gangadhar

C文字列のタイプはchar []だからです。配列名にはそのアドレスの値がありますが、int変数にはありません。&を使用する必要があります

void mainと書くのは間違っています。常にint mainを使用する必要があります。

7
Yu Hao

Cでは、文字列は文字の配列です(\0文字で終了)。

配列名は配列の最初の要素のポインタ(配列が格納されているメモリの場所)を返し、スカラー変数の名前はスカラーの値を返すため、&演算子を使用してメモリの場所を取得する必要があります値を書き込む必要があるスカラーの。

1
Nemanja Boric