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
ます。
ポインターの使用法:
以下に示すようにポインターを使用すると、ポインターをインクリメントして配列の別の場所に値を取得する方法がわかります。
ポインターの位置を移動して、配列を読み取ることができます。ポインターの位置を移動せずに配列を読み取ることができます。
ポインターの位置を移動して配列を読み取る
#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
}
}
ポインターの位置を移動せずに配列を読み取る。
#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) にあります。