質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

解決済

2回答

114閲覧

Cでの引数に配列を渡した場合について

slimat

総合スコア57

C

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

0グッド

1クリップ

投稿2018/11/28 13:57

編集2019/07/31 05:36

こんにちは。

次のコードはプログラムの1部を抜粋したものです。

c

1static void transform(double v2[], double m[][4], double v1[]) { 2 int j; 3 4 for (j = 0; j < 4; ++j) 5 { 6 v2[j] = m[j][0] * v1[0] 7 + m[j][1] * v1[1] 8 + m[j][2] * v1[2] 9 + m[j][3] * v1[3]; 10 } 11} 12 13static void project(double t[][4], double m[][4], double v[][4], int n) { 14 int k; 15 for (k = 0; k < n; ++k) { 16 transform(t[k], m, v[k]); 17 } 18}

関数projectから関数transformを呼び出した時に、projectにあるように、transformの実引数の第一引数にt[]を指定しているのですが、仮引数のv2[]がそのままt[]に取って代わるのでしょうか?
transformのfor文のv2[]もt[]に取って代わるのでしょうか?
実行すると、v2[]ではなくt[]に値が入っていたので、不思議に思いました。つまり、

c

1v2[j] = m[j][0] * v1[0] 2 + m[j][1] * v1[1] 3 + m[j][2] * v1[2] 4 + m[j][3] * v1[3];

ではなく、

c

1t[j] = m[j][0] * v[0] 2 + m[j][1] * v[1] 3 + m[j][2] * v[2] 4 + m[j][3] * v[3];

と処理されて、tに値が入っていました。
戻り値がある関数をよく扱うせいなのか分かりませんが、不思議に思いました。

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

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

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

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

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

ttyp03

2018/11/29 01:43

質問内容とタイトルが一致していません。質問の趣旨は引数に配列を渡した場合の挙動についてと思われます。戻り値がないことは何ら関係ありません。
slimat

2018/11/29 03:40

そうなんですね!変えておきます。ありがとうございます。
guest

回答2

0

ベストアンサー

Cの関数の引数に配列名を指定した場合、ポインタのように扱われます。
transform(double v2[],・・・

transform(double *v2,・・・
と同じように扱われます。
よって、v2[]への代入はt[]の内容を書き換えます。

余談ですが、「戻り値」の有無とは無関係です。

投稿2018/11/29 01:46

nob.

総合スコア711

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

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

slimat

2018/11/29 03:52 編集

回答ありがとうございます。 回答の3行目でv[]となって、[]が付いているのは、実引数には配列が来ることを示すためなのでしょうか? スマホで見ているので、そちら側で何行目に表示されているか分かりませんが、、、
guest

0

transform(t[k], m, v[k]);

t[][4] は、4要素の配列の、配列なので、t[k]ってのは、k番目の4要素の配列、となります
これを引数に渡すと、v2[4] になりますね
v も同様です

投稿2018/11/28 14:01

y_waiwai

総合スコア87774

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

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

slimat

2018/11/29 01:01

回答ありがとごさいます。 私もそのように思ったのですが、追記のように、関数に渡した実引数の配列に値が入っていたので疑問に思いました。
y_waiwai

2018/11/29 05:18

そりゃ配列のナカミを操作すれば元の配列のナカミも変わりますね 注意すべきは、関数に渡してるのはあくまでアドレスである、ってことです
slimat

2018/11/29 07:48

たしかに、今考えてみたら、配列名を渡しているので(2次元配列の実引数の配列名は一つ[ ]をつけることは知らなかった、2次元配列を渡した経験がなかったので、考えもしなかった)すが、仮引数に*がついてなかったので、配列名はアドレスを渡すことを忘れてしまっていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問