ただし, 演算を行う部分は関数で実現すること. また, 配列と構造体のそれぞれの場合について, 関数に値を渡す場合と, アドレスを渡す場合のそれぞれのプログラムを作成すること.
作成したプログラム(.cが付くファイル)をメールで提出する. さらに課題1で用いた入力ファイルを提出すること. 本文に, 学籍番号, 氏名を明記すること.
#include <stdio.h> #include <stdlib.h> int main(void) { double x, y; x = 3.0; y = x; printf("y=%f\n", y); return EXIT_SUCCESS; }
#include <stdio.h> #include <stdlib.h> typedef struct { double v1; double v2; double v3; } VECTOR; int main(void) { VECTOR x = {1.0, 2.0, 3.0}; // 初期化 VECTOR y; y = x; // 代入 printf("y.v1=%f\n", y.v1); printf("y.v2=%f\n", y.v2); printf("y.v3=%f\n", y.v3); return EXIT_SUCCESS; }
関数に渡す.
#include <stdio.h> #include <stdlib.h> void func(double y) // y = x; のように代入される. { printf("y=%f\n", y); y=10.0; } int main(void) { double x = 3.0; func(x); printf("x=%f\n", x); // x の値は変わらない. return EXIT_SUCCESS; }
#include <stdio.h> #include <stdlib.h> typedef struct { double v1; double v2; double v3; } VECTOR; void func(VECTOR y) // y = x; のように代入される. { printf("y.v1=%f\n", y.v1); printf("y.v2=%f\n", y.v2); printf("y.v3=%f\n", y.v3); y.v1 = 10.0; } int main(void) { VECTOR x = {1.0, 2.0, 3.0}; func(x); printf("x.v1=%f\n", x.v1); // x.v1の値は変わらない. return EXIT_SUCCESS; }
関数から返す.
#include <stdio.h> #include <stdlib.h> double func(void) { double x; x = 3.0; return x; } int main(void) { double y; y = func(); printf("y=%f\n", y); return EXIT_SUCCESS; }
#include <stdio.h> #include <stdlib.h> typedef struct { double v1; double v2; double v3; } VECTOR; VECTOR func(void) { VECTOR x = {1.0, 2.0, 3.0}; return x; // 関数は 構造体を返すことができる. } int main(void) { VECTOR y; y = func(); printf("y.v1=%f\n", y.v1); printf("y.v2=%f\n", y.v2); printf("y.v3=%f\n", y.v3); return EXIT_SUCCESS; }
main 関数内で用いる.
#include <stdio.h> #include <stdlib.h> int main(void) { double x; double *y; x = 3.0; y = &x; printf("y=%f\n", *y); *y = 10.0; printf("x=%f\n", x); // の値は書き換えれていにことに注意. return EXIT_SUCCESS; }
#include <stdio.h> #include <stdlib.h> typedef struct { double v1; double v2; double v3; } VECTOR; int main(void) { VECTOR x = {1.0, 2.0, 3.0}; VECTOR *y; y = &x; printf("y.v1=%f\n", y->v1); // y.v1 ではないことに注意. printf("y.v2=%f\n", y->v2); printf("y.v3=%f\n", y->v3); y->v1 = 10.0; printf("x.v1 = %f\n", x.v1); // x.v1 の値が書き換えられていることに注意. return EXIT_SUCCESS; }
関数に渡す.
#include <stdio.h> #include <stdlib.h> // y = x; のように代入される. // x のアドレスを受け取ることになる. void func(double *y) { printf("y=%f\n", *y); // ポインタ変数の復習をしておきましょう. *y=10.0; } int main(void) { double x = 3.0; func(&x); // アドレスを渡す. printf("x=%f\n", x); // x の値は変わる. return EXIT_SUCCESS; }
#include <stdio.h> #include <stdlib.h> typedef struct { double v1; double v2; double v3; } VECTOR; void func(VECTOR *y) // アドレスを受け取る. y = x; のように代入される. { printf("y->v1=%f\n", y->v1); // y はポインタ変数であるので printf("y->v2=%f\n", y->v2); // y.v2 ではなく, printf("y->v3=%f\n", y->v3); // y->v2 または (*y).v2 y->v1 = 10.0; // アドレスを受け取っているので x.v1 に代入していることになる. } int main(void) { VECTOR x = {1.0, 2.0, 3.0}; func(&x); // アドレスを渡す. printf("x.v1=%f\n", x.v1); // x.v1の値は変わる. return EXIT_SUCCESS; }
関数から返す.
#include <stdio.h> #include <stdlib.h> double a; double *func(void) { a = 10.0; return &a; // アドレスを返す. } // この関数は誤り. double *func_wrong(void) { double x; // このx はこの関数内でのみ使用できる. x = 10.0; return &x; // アドレスを返すことはできるが, そのアドレス上の領域は, // この関数から戻ったときに別の変数に使われる. } int main(void) { double y; y = *func(); // 返されたアドレス上の値を得る. printf("y=%f\n", y); return EXIT_SUCCESS; }
#include <stdio.h> #include <stdlib.h> typedef struct { double v1; double v2; double v3; } VECTOR; VECTOR a; VECTOR *func(void) { a.v1 = 1.0; a.v2 = 2.0; a.v3 = 3.0; return &a; // アドレスを返す } int main(void) { VECTOR y; y = *func(); // 返されたアドレス上の値を得る. // もし func 内で変数を宣言し, その変数のアドレスを返されても // ここでは その変数の値は使用できない. printf("y.v1=%f\n", y.v1); return EXIT_SUCCESS; }
main関数内で使う.
#include <stdio.h> #include <stdlib.h> int main(void) { double x[3] = {1.0, 2.0, 3.0}; // 初期化 double y[3]; y[0] = x[0]; // 代入 y[1] = x[1]; y[2] = x[2]; printf("y[0]=%f\n", y[0]); printf("y[1]=%f\n", y[1]); printf("y[2]=%f\n", y[2]); return EXIT_SUCCESS; }
#include <stdio.h> #include <stdlib.h> typedef struct { double v1; double v2; double v3; } VECTOR; int main(void) { VECTOR x[2] = {{1.0, 2.0, 3.0}, {10.0, 20.0, 30.0}}; printf("x[0].v1=%f\n", x[0].v1); printf("x[1].v1=%f\n", x[1].v1); return EXIT_SUCCESS; }
関数に渡す. 配列のコピーを渡しているのではなく, アドレスを渡していることに注意.
#include <stdio.h> #include <stdlib.h> // 配列の先頭要素のアドレスを受け取る. // ポインタ変数と同じ. void func(double y[]) { printf("y[0]=%f\n", y[0]); y[0] = 10.0; } int main(void) { double x[3] = {1.0, 2.0, 3.0}; func(x); printf("x[0] = %f\n", x[0]); // 値が書き換わることに注意. return EXIT_SUCCESS; }
#include <stdio.h> #include <stdlib.h> typedef struct { double v1; double v2; double v3; } VECTOR; void func(VECTOR y[]) // アドレスを受け取る. y = x; のように代入される. { printf("y[0].v1=%f\n", y[0].v1); y[0].v1 = 10.0; } int main(void) { VECTOR x[2] = {{1.0, 2.0, 3.0}, {10.0, 20.0, 30.0}}; func(x); // アドレスを渡す. printf("x[0].v1=%f\n", x[0].v1); // x[0].v1の値は変わる. return EXIT_SUCCESS; }
関数から返すことはできない.
#include <stdio.h> #include <stdlib.h> double *func(void) { double a[3] = {1.0, 2.0, 3.0}; return a; // 関数は配列を返すことはできないので誤り. } int main(void) { double *p; p = func(); printf("p[0] = %f\n", p[0]); return EXIT_SUCCESS; }
#include <stdio.h> #include <stdlib.h> int main(void) { double x[3] = {1.0, 2.0, 3.0}; double *y; y = x; // 配列名は配列の先頭の要素のアドレスを表す. printf("y[0]=%f\n", y[0]); // *(y+i) と y[i] は同じ意味. printf("y[1]=%f\n", y[1]); printf("y[2]=%f\n", y[2]); y[0] = 10.0; printf("x[0] = %f\n", x[0]); // x[0] の値は書き換えられていることに注意. return EXIT_SUCCESS; }
関数に渡す.
#include <stdio.h> #include <stdlib.h> // 配列の先頭要素のアドレスを受け取る. // 配列と同様に扱うことができる. void func(double *y) { printf("y[0]=%f\n", y[0]); printf("*y=%f\n", *y); y[0] = 10.0; } int main(void) { double x[3] = {1.0, 2.0, 3.0}; func(x); printf("x[0] = %f\n", x[0]); // 値が書き換わることに注意. return EXIT_SUCCESS; }
#include <stdio.h> #include <stdlib.h> typedef struct { double v1; double v2; double v3; } VECTOR; void func(VECTOR *y) // アドレスを受け取る. y = x; のように代入される. { printf("y[1].v1=%f\n", (y+1)->v1); // printf("y[1].v1=%f\n", (*(y+1)).v1); // printf("y[1].v1=%f\n", y[1].v1); と同等. (y+1)->v1 = 10.0; // y[1].v1 = 10.0; と同等. } int main(void) { VECTOR x[2] = {{1.0, 2.0, 3.0}, {10.0, 20.0, 30.0}}; func(x); // アドレスを渡す. printf("x[0].v1=%f\n", x[0].v1); // x[0].v1の値は変わる. return EXIT_SUCCESS; }
#include <stdio.h> #include <stdlib.h> int main(void) { // ポインタ変数はy = &x;のようにアドレスを代入してから使う. printf("*y=%f\n", *y); // 誤り. *y = 10.0; // 誤り. printf("*y=%f\n", *y); // 誤り return EXIT_SUCCESS; }
#include <stdio.h> #include <stdlib.h> typedef struct { double v1; double v2; double v3; } VECTOR; // ポインタ変数は, VECTOR x = {1.0, 2.0, 3.0}; y = &x; のように // アドレスを代入してから用いる必要がある. int main(void) { VECTOR *y; y->v1 = 10.0; // 誤り. printf("x.v1 = %f\n", x->v1); // 誤り. return EXIT_SUCCESS; }
#include <stdio.h> #include <stdlib.h> // ポインタ変数はアドレスを代入してから使う. // double x[3] = {1.0, 2.0, 3.0}; のように記憶域上の領域を用意しておいてから, // y = x; のようにアドレスを代入する必要がある. int main(void) { double *y; y[0] = 10.0; // 誤り. printf("y[0] = %f\n", y[0]); //誤り. return EXIT_SUCCESS; }