関数に配列を渡す


ソースコード

源文件
  1|/* param01.c */
  2|
  3|#include <stdio.h>
  4|
  5|int showarray(int *);
  6|
  7|int main(void)
  8|{
  9|  int a[3] = {10, 20, 30};
 10|
 11|  showarray(a);
 12|
 13|  return 0;
 14|}
 15|
 16|int showarray(int x[])
 17|{
 18|  int i;                                                                              
 19|  for(i = 0; i < 3; i++){
 20|    printf("x[%d] = %d\n", i, x[i]);
 21|  }
 22|  return 0;
 23|}

実行結果

x[0] = 10
x[1] = 20
x[2] = 30

プロトタイプ宣言は、

int showarray(int *);

となっていますが、実際の関数は

int showarray(int x[])

となっています。要するに、引数がint型へのポインタであるということがわかればよいのです。プロトタイプ宣言に

int showarray(int x[]); とか

int showarray(int x[3]);

と買いても問題ありません。関数側についても

int showarray(int x[])

int showarray(int x[3])

int showarray(int *x)

などの書き方があります。この場合も添字の3は無視されます。


もう少し複雑の例を見てみましょう。

ソースコード

源文件
  1|/* param02.c */                                                                       
  2|
  3|#include <stdio.h>
  4|
  5|int showname(char **);
  6|
  7|int main(void)
  8|{
  9|  char *name[] = {
 10|    "鈴木",
 11|    "与那覇",
 12|    "Polo",
 13|    "ガリュウヤ",
 14|  };
 15|
 16|  showname(name);
 17|
 18|  return 0;
 19|}
 20|
 21|int showname(char **p)
 22|{
 23|  int i;
 24|
 25|  for(i = 0; i < 4; i++){                                                             
 26|    printf("%s\n", p[i]);
 27|  }
 28|  return 0;
 29|}

実行結果

鈴木
与那覇
Polo
ガリュウヤ

showname 関数の引数は char 型へのポインタのポインタですね。プロトタイプ宣言や関数を書くときは、次のどちらでもよいことになります。

int showname(char *p[])

int showname(char **p)



次の多次元配列を関数に渡す場合のプロがラムを見てみましょう。

ソースコード

源文件
  1|/* param03.c */
  2|                                                                                      
  3|#include <stdio.h>
  4|
  5|int showint(int x[][2]);
  6|
  7|int main(void)
  8|{
  9|  int a[][2] = {
 10|    {1, 2},
 11|    {3, 4},
 12|    {5, 6},
 13|    {7, 8},
 14|  };
 15|
 16|  showint(a);
 17|
 18|  return 0;
 19|}
 20|
 21|int showint(int a[][2])
 22|{
 23|  int i, j;
 24|  for(i = 0; i < 4; i++){
 25|    for(j = 0; j < 2; j++){                                                           
 26|      printf("a[%d][%d] = %d\n", i, j, a[i][j]);
 27|    }
 28|  }
 29|  return 0;
 30|}

実行結果

a[0][0] = 1
a[0][1] = 2
a[1][0] = 3
a[1][1] = 4
a[2][0] = 5
a[2][1] = 6
a[3][0] = 7
a[3][1] = 8

多次元配列の場合、省略できる添字は最初のもののみでした。引数もこれと同じです。

さて、この例では、showint関数あ

  1. int showint(int m[][2])
  2. int showint(int (*m)[2])
  3. int showint(int **)

ともかけます。特に2の書き方に注意してください。「*m[2]」と書くと演算子の優先順位の関係より「*(m[2])」の意味になり、意図したものと異なってしまいます。関数に渡したいのは int 型へのポインタの配列です。したがって「(*m)[2]」となるわけです。



Chapte7 @ C言語目録 @ HomeWork List @ 昭亮's Homepage