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

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

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

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

Q&A

解決済

3回答

9975閲覧

配列を引数として使う方法について

ssspwp

総合スコア31

C

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

0グッド

0クリップ

投稿2017/11/01 02:23

#include<stdio.h> double avg(int t[]); int main() { int test[5]; int i; double ans; printf("5人のテストの点数を入力してください\n"); for (i = 0; i < 5; i++) { scanf_s("%d", &test[i]); } ans = avg(test);--------① printf("5人の平均点は%lf点です\n", ans); return 0; } /*関数の定義*/ double avg(int t[]) { int i; double sum; sum = 0.0; for (i = 0; i < 5; i++)----② { sum += t[i]; } return sum / 5; }

~わかっていること~
配列名は配列要素の先頭のアドレスを表わしている。

~よくわからないこと~
関数の定義のとこで、アドレスを仮引数として渡しているところが、いまいちよくわからないです。
①配列名を実引数として渡す→すなわち int t[]==(配列の先頭アドレス)?

②これは最終的にsumの値はsum=t[0]+t[1]+t[2]+t[3]+t[4]?

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

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

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

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

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

guest

回答3

0

関数avg()は、下記の書き方でも同じ結果を得られます。

C

1double avg(int *t) 2{ 3 int i; 4 double sum; 5 sum = 0.0; 6 for (i = 0; i < 5; i++)----7 { 8 sum += t[i]; 9 } 10 return sum / 5; 11}

配列を引数にする場合、配列のサイズが受け取った関数ではわからないところが欠点です。引数に要素の数も一緒に渡すやり方をよくします。

C

1double avg(int *t, int size) 2{ 3 int i; 4 double sum; 5 sum = 0.0; 6 for (i = 0; i < size; i++)----7 { 8 sum += t[i]; 9 } 10 return sum / 5; 11}

投稿2017/11/01 03:22

uroncha

総合スコア54

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

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

0

ベストアンサー

①配列名を実引数として渡す→すなわち int t[]==(配列の先頭アドレス)?

はい、C言語では、(sizeofの引数にした場合など一部の例外を除いて)式中に出てきた配列は、「配列の先頭アドレス」として解釈されます。[]演算子も、a[b]の実態は*(a + b)という、単なるポインタ演算です(読みにくいだけでメリットはほぼ皆無ですが、t[0]0[t]としても動作は変わりません)。

これは最終的にsumの値はsum=t[0]+t[1]+t[2]+t[3]+t[4]?

はい、そのとおりです。

投稿2017/11/01 02:29

maisumakun

総合スコア145121

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

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

0

こんにちは。

C言語では、配列名は配列先頭へのポインタとほぼ同じです。そして、ポインタを使って配列と同じ記述でアクセスできます。例えば、int *p=t;としてp[3]t[3]と同じ位置を示します。

更に、仮引数のint t[]int *tと全く同じになります。ある意味残念ですが、int t[5]と書いてもint *tと全く同じになります。

投稿2017/11/01 02:33

編集2017/11/01 02:34
Chironian

総合スコア23272

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

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

maisumakun

2017/11/01 02:45

「配列名のみ≠配列の先頭アドレス」となる例外には何があったか確認してみましたが、上で自分が書いたsizeof以外に「&arrのようにアドレスを取った場合(同じアドレスだけど、配列全体を指す型のポインタになる)」「char配列を文字列リテラルで初期化できる」ということでした。 http://kmaebashi.com/programmer/pointer.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問