概ね方位不定だが多分割と偏っている
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


C 一次元配列を渡す
2006年08月23日 (水) | 編集 |
さすがに夜になると涼しく感じるようにはなってきた。
昼は相変わらず真夏並にクソ暑いが。
必然的に夜遅くなってから行動を開始するので寝るのも遅くなるという悪循環。早く秋にならないものかね。


さて。

今回は配列データを関数に渡す方法だな。

これもcll by reference、参照によってデータを受け渡すらしい。
ってことは双方向ってことだな。
ポインタと一次元配列の時と同様、配列の先頭アドレスを渡し、後はポインタで順次配列のデータを参照する、という方式のようだ。
たとえば、int a[10]って配列を関数に渡す場合は、

func(a);
  ↓ 先頭アドレスを渡す
func(int a[ ])
{
 なんか式
}


とするらしい。func(a)のaは配列の先頭アドレスを示し、これを実引数として関数funcに渡す。func(int a[ ])のint a[ ]も配列に見えるが、ポインタでの配列の宣言はa[i]といった形式であり、この場合はiを省くので結果的にint a[ ]になる。配列っぽくて分かり辛いって場合はint *bって書いても可。結果は変わらない。
らしい。
関数側でデータを参照するときはa[1]とかa[9]とかでOKだ。

例によって実際にやってみよう。
入力された配列の合計を求める関数を作ってみる。

int add_str(int a[])
{
 int i,sum;
 i=sum=0;
 while(a[i]!=-9999){
  sum=sum+a[i];
  i++;
 }
 return(sum);
}


さっくりと。
配列を表現する為のi、合計値を求める為のsumを宣言。
後は配列の終わりを-9999とし、終わりになるまで合計値を求める計算をする。
-9999になってループを抜けたら合計値sumを戻り値として返す。勿論整数で。
うむ、問題無いな。
次はメイン関数。

void main(void)
{
 static int a[]={1,2,3,4,5,6,7,8,9,10,-9999};
 printf("とりあえず合計値は%dだぜ。何の、とは言わんが\n",add_str(a));
}


str_func_test.jpgstr_func_test2.jpg
こんな感じ

ついでに配列aの内容を配列bにコピーする関数も作ってみる。


void arr_copy(int a[ ],int b[ ])
{
 int i=0;
 while (a[i]!=-9999){
  b[i]=a[i];
  i++;
 }
 b[i]=-9999;
}


配列aの先頭アドレスを配列をコピーする関数arr_copyに渡し、
配列aの終わりまで内容を参照しつつ配列bにデータを格納し、
そしてこの関数自体は戻り値を持たないように。

void main(void)
{
 static int a[ ]={1,2,3,4,5,6,7,8,9,10,-9999};
 int b[100];
 int i;
 i=0;


配列aを宣言、初期化し、その内容をコピーされる配列bも宣言し、
その配列bを表示するのに使うループ関数iも宣言し、初期化する。 

 arr_copy(a,b);

で、配列aをコピーする関数arr_copyを呼び出す。
実引数として配列aと配列bの先頭アドレスを渡す。

 while(b[i]!=-9999){
  printf("%3d",b[i]);
  i++;
 }
}


コピーされたであろう配列b[i]の内容をループ構文で表示する。
これでOK。の筈。多分。

str_func_test3.jpgstr_func_test4.jpg
こんな感じ


まとめよう。

ポインタによる参照を利用して、配列のデータを関数に渡すことが出来る

以上。
やってることはややこしいのに定義そのものは残酷なまでにシンプルだぜ。
勘弁。


スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。