ここから本文です

C言語の配列について

山田太郎さん

2020/7/800:58:03

C言語の配列について

main関数のなかで、例えば
int n = 10;
としたとき、
int num[n];
このように配列の要素数をnにしていいんでしょうか。

#define n 10
とすれば大丈夫だったような気がするのですが、気になりまして。

あと、キーボードから入力する際、
for(i=0; i<n; i++)
scanf(“%d”,&num[i]);
↑ここの&って必要でしたっけ?

確か、scanfで&付けなくていいやつありましたよね
それって配列ですかね

補足&付けなくていいのは文字列とか入力する時とかですかね
char s[10];
scanf(“%s”,s);
のような

閲覧数:
91
回答数:
3

違反報告

ベストアンサーに選ばれた回答

yay********さん

2020/7/805:03:24

>int num[n];
>このように配列の要素数をnにしていいんでしょうか。

特定のバージョンのコンパイラ等では利用できます。

gccとCLangは独自拡張で前からできた。
gccでC99コンパイルは-std=c99または-std=gnu99オプション。

C11(だったかな?)で一度出来るようになったのですがC14で削除されて、
C99で改めて可変長配列が追加されました。
(追加されたからと言って全コンパイラが対応しているとはいいません。)

C99で可変長配列は自動変数(staticでないローカル変数)だけです。
(静的領域が可変とかおかしいので特に問題は出ないはず)
https://tyfkda.github.io/blog/2019/12/31/variable-length-array.html


>&付けなくていいのは文字列とか入力する時とかですかね

”文字列”ではなくて”配列”を使用する時です。
配列は&使わなくても入力先のアドレスを指し示している糖衣構文だからですね。

//以下は同じ内容
scanf("%s",s);
scanf("%s",&(*s));

質問した人からのコメント

2020/7/9 07:49:36

皆様ご回答ありがとうございます
勉強になりました
ベストアンサーは一番最初に回答して頂いた方に差し上げたいと思います。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

n2q37_cppさん

2020/7/808:17:49

既に良い回答が揃っているところに大変お恥ずかしいのですが解説動画を作ってみました。よろしければご覧ください。


【動画】C言語技術解説 配列について サイズに変数? &は必要? 知恵袋でのご質問より

https://youtu.be/GbABGesT_GI

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

2020/7/807:40:10

1989年のANSI Cまでは、配列の宣言の要素数は整定数(コンパイル時に決まっている)でなければいけませんでした。

これを、実行時に値が決まる変数等でもいいことにする「可変長配列」は、もとはgccの独自拡張でしたが、1999年のC99規格で規格化されました。

しかし、なかなかC99の普及が進まず、2011年のC11規格ではオプション(使えてもいいよ)に格落ちしました。C++の方には可変長配列が採択されていない、ということもあるのかも知れません。

現実としてはgccとその後継を目指しているclang(とその派生)くらいしか可変長配列は使えないようです。

---
別の質問は別の投稿とすべきかとは思いますがともかく。

> それって配列ですかね
そうですね。

Cでは、配列が単独で記述されると、配列の先頭要素へのポインタと解釈することになっています(一部の例外はありますが)。
scanfは、そもそもが書式指定子に従って標準入力のストリームを解釈し、成功すれば指定されたポインタが指す場所にデータを格納するという働きをします。
つまり、記述される変数がそもそも配列であれば、scanfの引数としてポインタが渡るのでそのまま記述するのが正しい使い方である場合もあります。
逆に、不用意に&をつけると意味が変わってしまって、意味としては間違っているような状態にもなり得ます。まぁ、状況的には動きますけれど。

char s[10];
において、
s は &s[0] 配列sの先頭要素のアドレスとして解釈されます。これは、charへのポインタです。
&sとすると、これは配列全体のアドレスの意味になります。
scanf("%s", &s)とすると、配列全体のアドレスは値としては配列の先頭要素のアドレスと同じですから動作はしますが、訳わからずに&つけたな...と思われるのは避けられません。
printf("%p %p\n", s+1, &s+1);
で表示されるものを見ると、&sの意味がちょっと見えてくるかも知れません。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる