こんてんつ
scanfの変数の前に&を付ける理由と意味について説明する。また、文字列charを扱う場合&を付けないことがあるが、何故いらないのかを説明する。
値(数値など)を入力する場合は&が必要
コード
#include<stdio.h> #include<string.h> int main(void){ int x; //値そのものを宣言 //この時点で&xは777番地などと割り当てられる printf("数値を入力してください:"); scanf("%d",&x); //&x(777番地)に入力した数値を格納 printf("入力した数値は%d\n",x); return 0; }
出力
図解
解説
図で示したようにアドレスにデータを受け渡しするため。
文字列を入力する場合はどちらでも良い
次の例ではscanf("%s",str);
の様に、書いている。これは、str
というものが&str[0]
と同じく文字列配列の最初の番地を示すアドレスだからである。この場所は別にscanf("%s",&str[0]);
やscanf("%s",&str);
と書いても同じ結果になる。
#include<stdio.h> #include<string.h> int main(void) { char str[256]; //この時点でstr[0]は900番地などと割り当てられる //この時点でstr[1]は901番地などと割り当てられる //この時点でstr[2]は902番地などと割り当てられる… printf("文字列を入力してください:"); scanf("%s",str); //strの配列の最初の番地から入力した数値を格納 //scanf("%s",%str);としても同じ //scanf("%s",%str[0]);としても同じ printf("入力した文字列は%s\n",str); printf("1文字目は %c\n",str[0]); printf("2文字目は %c\n",str[1]); printf("3文字目は %c\n",str[2]); return 0; }
出力
図解
解説
str
というものが&str[0]
と同じく文字列配列の最初の番地を示すアドレスだから。