Presentation is loading. Please wait.

Presentation is loading. Please wait.

プログラミング 3 構造体(2).

Similar presentations


Presentation on theme: "プログラミング 3 構造体(2)."— Presentation transcript:

1 プログラミング 3 構造体(2)

2 構造体のアドレス(1) 本日の例は struct frac { int numr, dnom; }; typedef struct frac Frac; と定義された構造体(分数を想定)で考える 構造体(全体)のアドレスを得ることができる Frac f; について, &f 構造体のメンバのアドレスは「&f.numr」「&f.dnom」のよ うに得られる(&(f.numr))

3 構造体のアドレス(2) 2 つの構造体の内容を交換 void swap(Frac *f1, Frac *f2) { Frac tmp; tmp = *f1; *f1 = *f2; *f2 = tmp; return; } 構造体は = 演算子ですべてのメンバをコピーできることに 注意 構造体へのポインタも,通常の変数へのポインタと同じよう に作れる

4 構造体のアドレス(3) 小数に直す(渡されたアドレスで処理) double val(Frac *f) { return (double)(*f).numr / (*f).dnom; } 「f の指す先の numr メンバ」(. 演算子のほうが * 演算子 より優先順位が高い) 「○の指す先の△メンバ」は -> 演算子で表せる(こ ちらのほうが一般的) double val(Frac *f) { return (double)f->numr / f->dnom; }

5 構造体のアドレス(4) C 言語の関数呼び出し:値で呼び出し 関数には実引数のコピーが渡る
構造体の場合も例外ではない →サイズの大きな構造体は受け渡しにコストがかかる →構造体は特に必要がない限りアドレスを渡すことが好まれ る

6 構造体のアドレスと配列(1) 構造体の配列も通常の配列と同じようにアドレス計算 ができる
Frac f[10]; のとき, f[0].numr と (*f).numr と f->numr f[1].numr と (*(f + 1)).numr と (f + 1)->numr f[n].numr と (*(f + n)).numr と (f + n)->numr はそれぞれ同じ

7 構造体のアドレスと配列(2) 構造体の配列を受け取る関数も作れる
通常の配列の場合と同じ(実際には構造体のアドレスを受け 取る) void value(double x[], Frac f[], int n) { int i; for (i = 0; i < n; i++) { x[i] = (double)f[i].numr / f[i].dnom; } return; } void value(double *x, Frac *f, int n) という書き方に読み替えられる ことを復習


Download ppt "プログラミング 3 構造体(2)."

Similar presentations


Ads by Google