構造体の関数の値渡しについて 構造体はデータ型が一緒だったら代入できるそうですが これも、main関数と自作関数の中で、別々に宣言された同じ型の構造体変数に代入しているような 形なんでしょうか?

構造体の関数の値渡しについて 構造体はデータ型が一緒だったら代入できるそうですが これも、main関数と自作関数の中で、別々に宣言された同じ型の構造体変数に代入しているような 形なんでしょうか? ① --------------------- #include<stdio.h> typedef struct { int line; int col;char moji; }rect_t; void drawrect(rect_t rect) { //この部分と int i, j; for (i = 1; i <= rect.line; i++) { for (j = 1; j <= rect.col; j++) { printf("%c", rect.moji); } putchar('\n'); } } int main(void) { rect_t rect1; rect1.line = 6; rect1.col = 32; rect1.moji = 'W'; drawrect(rect1); //この部分 } ------------------------ #include<stdio.h> struct xyz { int mx; long my; double mz; }; struct xyz set_xyz(int x, long y, double z) { struct xyz temp; temp.mx = x; temp.my = y; temp.mz = z; return(temp); //ここの部分と } int main(void) { struct xyz tb = { 0,0,0 }; tb = set_xyz(10, 320,35.6); //tbの部分 printf("tb.mx=%d\n", tb.mx); printf("tb.my=%ld\n",tb.my); printf("tb.mz=%f\n",tb.mz); } あと構造体は struct rect_t rect1 などと宣言したときにようやくメモリに展開されるであってますか?

C言語関連132閲覧xmlns="http://www.w3.org/2000/svg">50

ベストアンサー

0

(1)『main関数と自作関数の中で、別々に宣言された同じ型の構造体変数に代入しているような形なんでしょうか?』 ええ、そうですよ。 ① 引数 C言語ではポインタにすることが多いと思いますが、そうやって実物(?)にしてもOK。呼び出しの時点でコピー(代入と同じです)が発生します。 その時のコピーの動きが勿体無いのでポインタ。それが通常の考え方です。でも、そんなに大きなサイズでもないし、いいじゃないか…という考え方もあって良いと思います。 ご提示の構造体を見ます。 typedef struct { int line; int col;char moji; }rect_t; int 型2こ、char 型1個。ということはint 型3個分ですね。(char 型1個は半端なので int 型1個分の場所が取られます。) ポインタにした場合 int 型1個分または2個分。なので大差無い。やはり問題にならないレベルですね。(それでもポインタにする人は結構居ると思いますが) ② 戻り値 引数経由で構造体データを返すことが多いわけですが、そうやって戻り値として返してもOK。その関数が終わる直前にコピーが行われますけど。 で、先ほどのお話と同じになりますが、そのコピーを嫌がる人と、そうでない人と、2種類居ます。 (2)『構造体は struct rect_t rect1 などと宣言したときにようやくメモリに展開されるであってますか?』 ええ、合ってますよ。 もし、(1)の①にあるコードが前提だとすると rect_t rect1; となります。rect_t は typedef されたものであるので struct キーワードは書きません。

ThanksImg質問者からのお礼コメント

分かりやすかったです。回答していただき ありがとうございます。

お礼日時:2016/2/19 12:38