スポンサードリンク
HOME > C言語 > 値渡しとアドレス渡し

C言語 - 値渡しとアドレス渡し

関数の引数に値を渡す場合、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の値は、それぞれ、teihentakasaに代入され、
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関数の値渡しでは、構造体のメンバagebloodshow1関数の仮引数p
代入し、関数内の処理が行われます。
この場合、int型のagechar型3つで7バイト分の値渡しが行われた事になります。

そして、show2関数のアドレス渡しでは、tanaka構造体のポインタをshow2関数の
仮引数pに代入し、関数内の処理が行われます。
この場合、ポインタ型なので、4バイト分のアドレス渡しが行われた事になります。

構造体のメンバがどれだけ増えてもアドレス渡しを行えば、一律4バイトです。
このように、構造体を使う場合は、値渡しよりもアドレス渡しの方が
処理が軽くなる事が分かります。

ポインタ渡しは、構造体のメンバが多くなればなる程、絶大な威力を発揮します。
構造体のアドレス渡しを行う場合は、極力、アドレス渡しを使いましょう。


値渡しの特徴
値渡しのみの引数で構成された関数は、
その関数内の変数しかいじれませんので(グローバル変数は除く)、
他の関数に影響を及ぼす事がなく、安心、安全で管理しやすい関数となります。


アドレス渡しの特徴
一方、アドレス渡しを使うと、渡されたアドレスを使って関数外の変数もいじれます
便利ではありますが、他の関数にも影響を与えるので、
注意しながら使わなければなりません。



スポンサードリンク







HOME

言語解説編
プログラミング用語・知識

C言語

C++言語

Java

C#

Visual Basic.NET

アプリケーション編
C言語による
コンソールプログラミング




Copyright (C) プログラミングランド All Rights Reserved