int function(int N, int c[N]){...}
整数と配列をパラメーターとして取る関数 があるとします。サイズが 'N x 2' のdouble 配列があり、この関数を二重矢印の 1 つの列に**c
適用したいとします。この機能をどのように使用すればよいでしょうか。のように見えますか?function
c[i][0]
i
function(N,*c[0])
誰でも助けることができますか?
int function(int N, int c[N]){...}
整数と配列をパラメーターとして取る関数 があるとします。サイズが 'N x 2' のdouble 配列があり、この関数を二重矢印の 1 つの列に**c
適用したいとします。この機能をどのように使用すればよいでしょうか。のように見えますか?function
c[i][0]
i
function(N,*c[0])
誰でも助けることができますか?
Cの配列は、関数に渡されると常に最初の要素へのポインターに減衰します。これは、状況によっては知っておくとよいでしょう。
例として、あなたは書くことができます
int list[10];
func (int *x) {
int i;
for (i = 0; i < 10; i++) {
printf("%d", x[i]);
}
}
x[i]は実際には単なる構文糖衣です。Cでは、角かっこ表記を使用して配列の要素にアクセスすると、*(x + i)に変換されます。ここで、xは配列の名前です。
これは、ポインタ演算のために機能します。xが10個の整数の配列の名前である場合、式のxの値は、配列の最初の整数のアドレスです。
x + iは、常にxの後のi番目の要素を指します(Cは、配列に格納されている要素タイプのサイズを考慮し、それに応じてポインターをインクリメントします)。
したがって、2次元配列を渡すと、配列は最初の要素(配列)へのポインターに減衰します。
2D配列をとる関数シグネチャは、次のように記述できます。
func(int x[][columns] {
...
}
// but could also be written as
func(int (*x)[columns]) {
...
}
これは、xが整数の配列へのポインターであることを示しています。
実行時まで幅がわからない2次元配列を受け入れる関数を作成する必要がある場合があります。この場合、[0] [0]要素にポインターを渡し、2次元を渡してから、ポインター演算を使用して適切な要素を取得できます。例えば、
print_2d_array (int *x, height, width) {
int i, j;
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
printf("%d", x[i * width + j]);
}
}
}
int list[10][10];
print_2d_array (&list[0][0], 10, 10);
動的に割り当てられた2D配列で機能します。
C言語では、一次元配列の場合、配列をその関数に渡すときに、関数の引数で配列のサイズについて言及する必要はありません。
一次元配列の場合
...
int a[10];
func(10, a);
...
void func(int size, int x[]) //no need to mention like int x[10]
{
//here x is not an array. Its equivalent to int *
printf("%d", sizeof(x)); // this will print 4 or 8 not 40
}
二次元配列の場合
...
int a[10][5];
func (10, a);
...
void (int rows, int x[][5]) //here int x[][] is invalid
{
}