19

を使用しているときに c でアンパサンドを使用するための規則は何scanf()ですか?

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ですか?

アンパサンド記号をいつ使用するかについて規則はありますか?

4

3 に答える 3

29

scanf は、2 番目、3 番目、4 番目などの引数として渡される特定のタイプのデータをアドレスに読み込みます。

int var;
scanf("%d",&var);

これvarが値で、&varアドレスです。上記のステートメントは次のように述べています。 %d(整数) タイプのデータを&varアドレスに読み込みます。

char s[20];
scanf("%s",s);

は文字配列 (文字列) であるsため、値ではありません。s配列名自体がそのアドレスを示します。s == &s[0]、これらは両方とも同じです。

上記のステートメントは次のように述べています: %s(文字の配列) タイプのデータを から始まるアドレス位置に読み込みますs

#include<stdio.h>
#define MAX 5

int 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.
    }
}

%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
    
    int 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
    
    int 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

int 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  
    }
}

上記のほとんどは、Brian W. Kernighan と Dennis M. Ritchie による The C Programming Language (Second edition) にあります。

于 2013-08-23T13:13:19.680 に答える
1

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

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

于 2013-08-23T12:42:54.123 に答える