8

重複の可能性:
2D 配列を表すポインターを C++ の関数に渡す

2 次元配列をポインターを介して関数に渡そうとしていますが、値を変更したいと考えています。

#include <stdio.h>

void func(int **ptr);

int main() {
    int array[2][2] = {
        {2, 5}, {3, 6}
    };

    func(array);

    printf("%d", array[0][0]);
    getch();
}

void func(int **ptr) {
    int i, j;
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++) {
            ptr[i][j] = 8;
        }
    }
}

しかし、これでプログラムがクラッシュします。私は何を間違えましたか?

4

2 に答える 2

9

あなたの配列はタイプint[2][2](「2intの2配列の配列」)であり、その名前はタイプint(*)[2](「2intの配列へのポインター」)である最初の要素へのポインターに減衰します。したがって、funcこのタイプの引数を取る必要があります。

void func(int (*ptr)[2]);
// equivalently:
// void func(int ptr[][2]);

または、配列タイプへの参照(「2intの2配列の配列への参照」)を取得することもできます。

void func(int (&ptr)[2][2]);

宣言と定義の両方を必ず変更してください。

于 2012-12-23T15:12:43.467 に答える
3

配列はポインタへのポインタではないため、クラッシュします。配列の値をポインタであるかのように読み取ろうとしますが、配列にはポインタのないデータのみが含まれます。
配列はすべてメモリ内で隣接しており、関数を呼び出すときに単一のポインタを受け入れてキャストを実行するだけです。

func((int*)array);

..。

void func(int *ptr) {
    int i, j;
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++) {
            ptr[i+j*2]=8;
        }
    }
}
于 2012-12-23T15:14:45.840 に答える