【C言語】scanfの変数の前には、なぜ&をつけるのか

こんてんつ

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]と同じく文字列配列の最初の番地を示すアドレスだから。