【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22797

ポインタの引数と戻り値
投稿者---あきき(2005/08/24 21:45:32)


http://www.geocities.jp/ky_webid/c/030.html

のサイトで、以下の文章で特に、配列を引数にできない理由を少し砕けながらも分かりやすい文章に直してもらえないでしょうか?
なぜ、配列を引数にできないのでしょうか

”ポインタを引数にするということは、引数として変数のアドレスを渡すということです。
ポインタを引数にする理由・利点は幾つかあります。まず、覚えておいてほしいのは、配列を引数にできないというC言語のルール”



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ポインタの引数と戻り値 22798 επιστημη 2005/08/24 21:52:45


No.22798

Re:ポインタの引数と戻り値
投稿者---επιστημη(2005/08/24 21:52:45)


>なぜ、配列を引数にできないのでしょうか

配列を引数とする構文が用意されていないから。



この投稿にコメントする

削除パスワード

No.22799

Re:ポインタの引数と戻り値
投稿者---あきき(2005/08/24 22:03:08)


>配列を引数とする構文が用意されていないから。

C言語で用意された標準関数のパラメータだけではなく、自作の関数でもでしょうか?
そして、そもそもなぜ、配列を引数とする構文が用意されてないのでしょうか?



この投稿にコメントする

削除パスワード

No.22800

Re:ポインタの引数と戻り値
投稿者---Hermit(2005/08/24 22:14:53)


>C言語で用意された標準関数のパラメータだけではなく、自作の関数でもでしょうか?
>そして、そもそもなぜ、配列を引数とする構文が用意されてないのでしょうか?

関数へ引数を渡すということは、
そのデーターのコピーを(通常スタック上に)作ってそれを渡すので、
配列だとメモリ領域を大量に使うことが多くなるからだと思います。



この投稿にコメントする

削除パスワード

No.22801

Re:ポインタの引数と戻り値
投稿者---RiSK(2005/08/24 22:19:09)


>C言語で用意された標準関数のパラメータだけではなく、自作の関数でもでしょうか?

そのとおりです。
ちょっとしたテクニックを使えば,「配列をそのまま渡せる」とも言えます。(後述)

>そして、そもそもなぜ、配列を引数とする構文が用意されてないのでしょうか?

・構文上「〜の配列型」が「〜へのポインタ型へ」変換されてしまうため。

・配列は大きなサイズになることが多く,
そのまま関数へコピーすることは負荷が大きいため。

もっとも,配列を構造体でくるみ,
その構造体を直接渡せば,結果として,
(構造体にくるまれた)配列をそのまま関数へ渡したことにもなります。

現在は,配列を構造体を利用して関数へコピーしても,
速度の面でボトルネックにはならないという話もあります。
これについては,実測することがふさわしいでしょう。


この投稿にコメントする

削除パスワード

No.22802

Re:ポインタの引数と戻り値
投稿者---あきき(2005/08/24 23:23:51)


>>C言語で用意された標準関数のパラメータだけではなく、自作の関数でもでしょうか?
>
>そのとおりです。
>
>>そして、そもそもなぜ、配列を引数とする構文が用意されてないのでしょうか?
>
>・構文上「〜の配列型」が「〜へのポインタ型へ」変換されてしまうため。
>
後々コンパイラーがそのような処理をしてくれるのなら、配列を引数とする事はある意味では無駄なことですね。

>・配列は大きなサイズになることが多く,
>そのまま関数へコピーすることは負荷が大きいため。
>
 そこまでは考えませんでした。そのあたりもこれから気をつけて一つ一つ確認していきたいと思います。επιστημηさん、RiSKさん、Hermitさんありがとうございます。


この投稿にコメントする

削除パスワード

No.22803

Re:ポインタの引数と戻り値
投稿者---かずま(2005/08/25 03:19:37)


>> なぜ、配列を引数にできないのでしょうか

> 配列を引数とする構文が用意されていないから。
配列を引数とする構文は用意されています。

  (1) void f1(int i);      // int型を引数とする構文
  (2) void f2(int *p);     // ポインタ型を引数とする構文
  (3) void f3(int a[]);    // 配列型を引数とする構文
  (4) void f4(int f());    // 関数型を引数とする構文
  (5) void f5(struct t s); // 構造体型を引数とする構文

プログラミング言語の定義は、構文規則(syntax)と意味規則(semantics)で
構成されます。

配列を引数として渡せないのは、意味規則による制限です。構文によるもので
はありません。

規格書 JIS X3010:2003(ISO/IEC 9899:1999) では、「6.7.5.3 関数宣言
子(関数原型を含む)」の「意味規則」に次のような記述があります。

:   仮引数を“〜型の配列”とする宣言は、“〜型への修飾されたポインタ”
: に型調整する。

このため、上の (3) は、void f3(int *a); と同じと解釈されます。
同様に、(4) は、void f4(int (*f)()); と同じと解釈されます。

配列は、sizeof演算子のオペランド、単項&演算子のオペランドである場合を
除いて、配列の先頭要素を指すポインタに変換されるので、配列を引数として
関数に渡すことはできません。

int b[5]; という宣言があったとき、f3(b); という関数呼び出しでは、配列
b が b[0] へのポインタに変換されてしまうからです。

したがって、呼び出されるほうの関数の引数宣言も、たとえ配列の構文で書か
れていてもポインタであるかのように解釈することが意味規則で決められて
います。



この投稿にコメントする

削除パスワード

No.22804

Re:ポインタの引数と戻り値
投稿者---επιστημη(2005/08/25 05:15:59)


>>> なぜ、配列を引数にできないのでしょうか
>> 配列を引数とする構文が用意されていないから。
>配列を引数とする構文は用意されています。

ぁぅ、仰せの通りにございます orz
配列まるごと引数として関数にどかっと渡すすべがない、ってぇことでお許しを。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧