関数の引数に値を渡す場合、2つの方法があります。
1.値渡し
値渡しは、引数に数値を渡す、ごく普通の方法です。
#include <stdio.h>
int menseki(int teihen, int takasa);
void main(void) {
int ans;
ans = menseki(5, 10);
printf("面積=%d\n", ans);
}
int menseki(int teihen, int takasa) {
return teihen * takasa / 2;
}
|
この例では、menseki関数に実引数として底辺5と高さ10を渡しています。
この5と10の値は、それぞれ、teihen、takasaに代入され、
menseki関数の処理を実行します。
2.アドレス渡し
アドレス渡しは、ポインタ渡しとも言い、引数にアドレスを渡す方法です。
#include <stdio.h>
void menseki(int teihen, int takasa, int* p);
void main(void) {
int ans = 0;
menseki(5, 10, &ans);
printf("面積=%d\n", ans);
}
void menseki(int teihen, int takasa, int* p) {
p* = teihen * takasa / 2;
}
|
上の例では、menseki関数に実引数として
底辺5と高さ10とansのアドレスを渡しています。
面積を求めたら、ansのアドレスを使ってansに値を入れています。
#include <stdio.h>
struct hito {
int age;
char blood[3];
};
void show1(struct hito p);
void show2(struct hito* p);
void main(void) {
struct hito tanaka;
tanaka.age = 5;
tanaka.blood = "A";
show(tanaka);
show2(&tanaka);
}
void show1(struct hito p) {
printf("age = %d\n", tanaka.age);
printf("age = %s\n", tanaka.blood);
}
void show2(struct hito* p) {
printf("age = %d\n", tanaka->age);
printf("age = %s\n", tanaka->blood);
}
|
上の例では、構造体を使い、それぞれ値渡しとポインタ渡しを行っています。
show1関数の値渡しでは、構造体のメンバageとbloodをshow1関数の仮引数pに
代入し、関数内の処理が行われます。
この場合、int型のageとchar型3つで7バイト分の値渡しが行われた事になります。
そして、show2関数のアドレス渡しでは、tanaka構造体のポインタをshow2関数の
仮引数pに代入し、関数内の処理が行われます。
この場合、ポインタ型なので、4バイト分のアドレス渡しが行われた事になります。
構造体のメンバがどれだけ増えてもアドレス渡しを行えば、一律4バイトです。
このように、構造体を使う場合は、値渡しよりもアドレス渡しの方が
処理が軽くなる事が分かります。
ポインタ渡しは、構造体のメンバが多くなればなる程、絶大な威力を発揮します。
構造体のアドレス渡しを行う場合は、極力、アドレス渡しを使いましょう。
値渡しの特徴
値渡しのみの引数で構成された関数は、
その関数内の変数しかいじれませんので(グローバル変数は除く)、
他の関数に影響を及ぼす事がなく、安心、安全で管理しやすい関数となります。
アドレス渡しの特徴
一方、アドレス渡しを使うと、渡されたアドレスを使って関数外の変数もいじれます。
便利ではありますが、他の関数にも影響を与えるので、
注意しながら使わなければなりません。
スポンサードリンク
|