11-1. で見てきたように、上位の関数(呼ぶ側)から下位の関数(呼ばれる側)へデータを渡すことができますが、 その方法には、「データの値」を渡す方法と、「データのアドレス」を渡す方法があります。
11-1. の例はこれに相当します。
※ 実引数の値を仮引数に代入するため、実引数と仮引数の変数名は不一致で構いません。 また、値が渡されたあと、実引数と仮引数はまったく無関係になり、 仮引数の値が変更されても、実引数の値は変わりません。 ですから、仮に実引数と仮引数の名前が同一でも、両者は連動しません(次の例を参照してください)。
#include <stdio.h> int ex_sub(int num); int main(void) { int rc; int num = 100; rc = ex_sub(num); printf("num = %d\n", num); ⇒num = 100 を出力 printf("rc = %d\n", rc); ⇒rc = 5000 を出力 return 0; } int ex_sub(int num) { num = num * 50; ⇒num は 5000 になる return num; ⇒num(5000)を返す }
アドレス渡しでは、上位関数で配列のアドレスを渡し、下位関数でそれをポインタで受け取って処理します。
※ アドレス渡しでは、メモリ上の実際のアドレスを渡すため、下位関数側がその内容を変更すると、 上位関数側が用意していた内容を変更することになってしまいます。 そのため、意図的に、渡されたアドレスが指す値を変えるとき以外は、注意が必要です。
ご質問を頂きましたので、2次元配列を関数に渡す場合について補足致します。
2次元配列を関数に渡す処理は上記の(2)アドレスによる渡し に該当しますが、下位関数側はポインタではなく、2次元配列で受けるようにしてください。
2次元配列は、メモリ上ではあくまでも 1次元に並んでいます。2次元配列の先頭要素のアドレスを渡しても、関数側では、何列の配列なのかわかりません。
ですから、列の指定をした 2次元配列で受けてください。行の指定は、特にする必要はありません。
「初心者のためのポイント学習C言語」 Copyright(c) 2000-2004 TOMOJI All Rights Reserved