電子書籍の厳選無料作品が豊富!

教えてください。

配列とポインタについて、配列を関数の引数として使う時には、

実引数の側では、[]をつけない配列名を使い、
仮引数の側では要素数を指定せず配列名[]で受ける。

との事ですが、

配列を関数の引数として使う理由、、そこがあまりピンときません。
引数として使うということは、すなわち、具体的にどういった事が起こっているのでしょうか?

分かりにくい質問、申し訳ございません。宜しくお願い致します。

A 回答 (1件)

練習用の小さなプログラムならともかく、


実用的な規模になると、mainに全部書くのは非現実的です。
 int a1[10];
 int a2[10];
の2つの配列があったとして、これをソートするプログラムを作るとしたら、
 a1のソートプログラム
 a2のソートプログラム(a1のものをコピーしてa1→a2に書き換え)
と書くのは無駄です。
そこで
 ソート(a1);
 ソート(a2);
のように、配列を引数として受け付ける関数「ソート」を作って、引数として配列を渡すのが現実的です。
他にも、合計、平均、比較などなど、配列を対象にした処理はいくらでもあります。


 int a[5] ;
と宣言したら、「aという名前の配列」です。
関数に渡したいのは「配列」ですから、 「func(a)」のように、名前だけを使います。
宣言以外の場所では、 a[5] は、 配列aの5番目の要素、の意味になります。
 a : intの配列(長さ5) ;
っていう宣言だったら、 配列なのは「a」だとわかりやすかったかもしれませんが、
C言語ではそうなっていないので、受け入れるしかないです。


受け取る関数の定義は
 void func(型 b)
みたいに型を指定します。
これも 配列を受けとるときに
 void func(int配列 b)
みたいにできればいいのですが、できません。
/* typedefを使うなどで、できなくはないですが */
ここでの型の指定は、変数宣言するときと同じ書式にすることに決まっています。
なので
 void func(int b[])
となります。


仮引数の[] が空なのは、ちょっと複雑な事情があります。
正確に言えば、C言語では「配列を渡しません」
配列名は、いろんな場面で「先頭要素へのポインタ」となります。
func(a) としたときには、実は、 func( &a[0] ) と実行されています。

そして受けとる方関数側も「配列を受け取る」のではなく、「ポインタを受け取っています」
 void func(int b[])

 void func(int * b)
の別の書き方でしかありません。
ポインタには、「要素数」なんてものはないですから、引数の[]の中に数値を書いても使いどころがありません。
/* 多重配列だと、ちょっと事情が違います */
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!