記事ディレクトリ
C 言語における配列を返す関数は非常に重要なアプリケーションです。プログラム内で関数を呼び出して配列を返すと、複数の値を一度に返すなど、必要な特定の操作を簡単に実現できることがあります。この記事で紹介するのは例です。 C言語で1次元配列と2次元配列を返す関数の一覧です。
関数は 1 次元配列を返します
関数が 1 次元配列を返すときに注意する必要があるのは、関数を定義するときに、関数の型の後に * 記号を追加する必要があること、関数本体で定義された 1 次元配列にはキーワード static を追加する必要があることです。型の前、関数本体で定義 配列の長さを決定する必要があります。
1 次元配列を返す単純な関数の C コードは次のとおりです。
# include <stdio.h>
int* return_array () // 在定义返回一维数组的函数时,在定义的函数类型后要加*号
{
static int a[10]; //这里一定要加上static,这样数组a就是一个静态数组了,数组长度需要再这里确定
for(int i=0; i<10; i++)
a[i] = i;
return a;
}
int main ()
{
int *array;
array = return_array(); //调用函数
for(int i=0; i<10; i++)
printf("array[%d] = %d\n",i,array[i]);
}
上記のコードの最も重要な部分は、関数本体の配列を定義する部分ですが、なぜ配列の型を静的配列として定義する必要があるのか、つまり、型の前に static キーワードを追加する必要があるのでしょうか。これは、静的配列のライフ サイクルが実行から終了までプログラム全体で実行され、static キーワードを追加しない場合、関数本体で定義する配列はローカル変数であるため、上記関数はローカル変数 a です。関数呼び出し後は配列 a の値は存在しなくなるため、main 関数で関数を呼び出しても配列に格納されている値を取得することはできません。
上記のコードを実行した結果を次の図に示します。
ご覧のとおり、main 関数内で関数を呼び出して、関数本体で定義された配列の値を出力するのが正しいです。
配列定義時にキーワード static を追加しなかった場合、出力結果は以下のようになります。
操作の結果として、関数がローカル変数のアドレスを返すため、配列内の各値が正しく出力されないという警告が表示されます。
関数は 2 次元配列を返します
関数が 2 次元配列を返すときに注意する必要があるのは、関数を定義するときに、関数の型の後に * 記号を 2 つ追加する必要があること、関数本体で定義した 2 次元配列に行を割り当てる必要があることです。長さと列の長さを順番に並べます。次元配列の長さを決定する必要があります。
2 次元配列を返す単純な関数の C コードは次のとおりです。
# include <stdio.h>
# include <stdlib.h>
int** return_array ()
{
int** a;
a = (int**)malloc(5*sizeof(int*)); //分配行长度
for(int i=0; i<5; i++)
a[i] = (int*)malloc(5*sizeof(int)); //分配列长度
for(int i=0; i<5; i++) //给数组赋初值
for(int j=0; j<5; j++)
a[i][j] = i*10+j;
return a;
}
int main ()
{
int **array;
array = return_array(); //调用函数
for(int i=0; i<5; i++)
{
for(int j=0; j<5; j++)
printf("array[%d][%d] = %2d ",i,j,array[i][j]);
printf("\n");
}
}
上記のコードを実行した結果を次の図に示します。
以下に示すように、2 次元配列を定義するときに行の長さと列の長さが角かっこ内で直接指定されないのはなぜなのか疑問に思う人もいるかもしれません。
しかし、このように定義すると、定義した配列が戻り値の型と互換性がないことが出力で警告されます。
以上がC言語における1次元配列と2次元配列を返す関数のすべてです!
この記事の参考記事:
C言語関数で配列を正しく返すには?
関数の戻り値として2次元配列/2次元配列を転送