1

私はC++を初めて使用し、ポインターを学習しようとしています。実習として、ポインターへのポインターを使用してnxn行列を読み取ろうとします。これは私がこれまでに試したことですが、scanfは失敗しています。私は何が間違っているのですか?
後で編集:

int **matrix;
int i=0;
int j=0;
int li=0;
int dim;

printf("What is the dimmension:");
scanf("%d",&dim);
matrix=(int **)malloc(sizeof(int *) * dim);
for(li=0;li<dim;li++)
{
    matrix[li] = (int *)malloc(sizeof(int) * dim);
}
printf("Type the elements:\n");
for(i=0;i<dim;i++)
{
    for(j=0;j<dim;j++)
    {
        scanf("%d", matrix[i][j]);
    }
}
4

5 に答える 5

2

C ++を使用している場合は、次のようにしてください。

matrix = new int*[dim];
for(int = 0; i < dim; ++i)
    matrix[i] = new int[dim];

// to read matrix
scanf("%d", matrix[i][j]);
于 2012-04-16T17:18:21.743 に答える
1

2つ(および半分)の主なオプションがあります。各行を個別に割り当てることができます。

matrix = malloc(dim * sizeof(int*));  // gives you dim int*
for(i = 0; i < dim; ++i)
{
    matrix[i] = malloc(dim * sizeof(int)); // row i gets dim int
}

または、連続したチャンクを割り当てることができます

int *array = malloc(dim*dim*sizeof(int));

でそれにアクセスします

array[i*dim + j];

半分のオプションは、パックされたメモリレイアウトを使用することですが、それにアクセスするためのラッパーがありますmatrix[i][j]

int **matrix = malloc(dim*sizeof(int*));
for(i = 0; i < dim; ++i)
{
    matrix[i] = array + i*dim;
}

(もちろん、C ++では、通常、標準ライブラリによって提供されるタイプやその他のタイプを使用する以外にmalloc使用しません。)new

于 2012-04-16T17:26:40.097 に答える
0

通常の2D配列のようにアクセスでき、その場所matrix[i][j]を使用できるはずです。scanf

scanf("%d", &matrix[i][j]);

編集も、ポインタ自体を割り当てる必要があります。

matrix=(int **)malloc(sizeof(int *) * dim);
for(i = 0; i < dim; i++) {
    matrix[i] = (int *)malloc(sizeof(int) * dim);
}

また、これがまっすぐなC場合は、mallocからリターン型をキャストしないでくださいC。自動的にアップグレードされ、キャストによってバグが隠される可能性があります。

于 2012-04-16T17:17:39.623 に答える
0

ポインタへのポインタの最上位配列を割り当てましたが、割り当てられたメモリに次のレベルのポインタを設定していません。各ポインタマトリックス[i]のチャンクをmallocするループを作成するか、各ポインタを既存の割り当てられたメモリに設定すると、scanfで使用できます。

于 2012-04-16T17:17:59.327 に答える
0

ポインタの配列を実行しようとしている場合、ポインタはそれぞれ行を指しますが、実際には各行のポインタを自分で作成する必要があります。コードは次のとおりです。

// forM * N(またはN * N)

int **a;
a=malloc(M*sizeof(int *));
for(i=0;i<M;i++)
    a[i] = &aa[i][0];

そのコードを使用して、大きなmallocにポインターを割り当ててから、mallocのチャンクを各行の最初の要素に割り当てます。これにより、従来の2次元配列a [0] [0]、a [1] [1]、ecを使用して配列の参照を解除できます。これを説明する上での私の最良の参考資料は次のとおりです: http ://www.eskimo.com/~scs/cclass/int/sx9b.html

于 2012-04-16T17:25:28.610 に答える