teratail header banner
teratail header banner
質問するログイン新規登録
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

426閲覧

C言語 なぜchar1文字のscanfに&が必要なのか?

qaz_sd

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2025/06/16 04:26

0

0

参考資料

intの場合

scanfの第二引数には変数のアドレスを指定する必要があることは分かります。

c

1int main(void){ 2 int a; 3 scanf("%d",&a); 4 printf("%d\n",a); 5}
100 //入力 100 //出力

文字列の場合

文字列の場合、文字列の変数名&文字列の変数名[0](文字列の配列の先頭アドレス)を意味するから、変数名だけ書けば良いことも分かります。

c

1int main(void){ 2 char s[100]; 3 scanf("%s",s); //このsは&s[0]と同じ意味 4 printf("%s\n",s); 5}
aiueo //入力 aiueo //出力

1文字の文字列の場合

1文字の文字列の場合も、上記の通常の文字列と同じ記法で動作すると思ったのですがなぜか動作しません(&が必要)。

c

1int main(void){ 2 char c; //char c は char c[1]と同じ意味 3 scanf("%c",c); //このcは&c[0]と同じ意味 4 printf("%c\n",c); 5}
//scanfが作動せず、何も起こらずプログラムが終了する //scanf("%c",&c)とするとちゃんと動く

これは何故なのでしょうか。

補足情報

C99,gcc

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2025/06/16 09:39

c に「文字列」という変数は無いです。
guest

回答2

0

ベストアンサー

「char c は char c[1]と同じ意味」なんてわけではありません。
charはintの小さい版です。
あなたが言っている通りであればint aint a[1]と同じことになります。
そんなわけはないですよね。

一方で、char s[100];とした場合、sは「数値」ではなく「配列の先頭のアドレス」です。
だから&が省略できるわけです。
これは入門書に書かれてるはずなので、読み進めてください。

投稿2025/06/16 04:38

fiveHundred

総合スコア10454

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qaz_sd

2025/06/16 08:31 編集

ありがとうございます。 char aと char b[1]では確保されるメモリのバイト数が等しい(sizeof(a) = sizeof(b)) →確保されるメモリのバイト数が等しいとき、同じものとみなせる(同じような記法が使える) という勘違いから scanf("%s",b)よりscanf("%c",a)と書けるはずだと思っておりました。 scanfではアドレスを渡す必要があり、char配列の時は配列名が配列の先頭アドレスを表すから、&を付ける必要がないということですね。
guest

0

char s[100]; と宣言した場合に s の型は char[100] です。 配列型が式の中に現れた場合は一部の例外を除いてその先頭要素を指すアドレス (型で言えば char*) に暗黙に型変換されるというルールによって配列はアドレスとして扱われます。

scanf のように可変長引数の関数に渡す引数は「既定の実引数拡張」と呼ばれるルールによって型を調整してから渡すことになっており char 型の実引数は int に拡張されますが、勝手にアドレスになることは無いです。

投稿2025/06/16 05:22

SaitoAtsushi

総合スコア5740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問