2
int** mat = new int*[5];

// define the elements to be inserted to the matrix     
int* i1 = new int;
*i1 = 1;

int* i2 = new int;
*i2 = 2;

int* i3 = new int;
*i3 = 3;

int* i4 = new int;
*i4 = 4;

int* i5 = new int;
*i5 = 5;

// insert the elements to the matrix
mat[0] = i1;
mat[1] = i2;
mat[2] = i3;
mat[3] = i4;
mat[4] = i5;

次に、ポインターを定義します。このポインターを介してマトリックスを印刷したい。だから私はそれを定義します:

int* ptr = *mat;

そしてここで私はそれを印刷します:

for (int i = 0; i < 5; i++) {
    cout << *ptr << endl;
    ptr++;
}

しかし、私は得ました:

1
2543679
9826
257678
7853

ポインターを介して出力したい (そして ++ を実行したい) ことを覚えておいてくださいptrfor loop

4

1 に答える 1

4
int* ptr = *mat;

ここでは同等です

int *ptr = i1;

ptrと同じ場所を指すようにしますi1。次に、インクリメントptrするとint、where ポイントの 1 つ後ろのポイントにi1なります。そこにはメモリが割り当てられていない(そして満たされていない)ため、インクリメントされたポインターを逆参照すると、未定義の動作が呼び出されます(さらにインクリメントすると、逆参照しなくても未定義の動作が呼び出されます)。

配列を移動するには、次のものが必要です

int **ptr = mat;
for (int i = 0; i < 5; i++) {
    cout << **ptr << endl;
    ptr++;
}

(ただし、添え字を使用する

for(int i = 0; i < 5; ++i) {
    cout << *mat[i] << endl;
}

より読みやすくなります)

于 2013-05-25T10:26:16.050 に答える