Download presentation
Presentation is loading. Please wait.
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) という書き方に読み替えられる ことを復習
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.