1

間接参照のレベル 2 を指す追加のポインターを使用して、3 レベルのポインター間接参照を作成しようとしています。これはクラスのためのもので、いくつかの実際の問題があります。これが私がやっていることです。

int ***s = new int **[row];
*s = new int *[row];
**s = new int[row];

これらが配列ではなくintだけの場合、私ができることは、

***s = 1;

写真の黄色い四角に格納するには、配列要素にアクセスする方法がわかりません。いくつか試してみましたが、クラッシュするか、コンパイルされません。どんな助けでも、私を正しい方向に向けることさえ非常に役に立ちます。ありがとうございました。

ポインタ図

4

2 に答える 2

1

row = 3この例で言いましょう。

int ***s;
// s=[?]
// s is an uninitialized variable.

s = new int **[row];
// s[*] -> [?]
//         [?]
//         [?]
// s points to the first element of an array of size 3.
// The elements are uninitialized.

*s = new int *[row];
// s=[*] -> [*] -> [?]
//          [?]    [?]
//          [?]    [?]
// We've initialized s[0]. It points to another array of size 3.
// All elements of that array are also uninitialized, along with s[1] and s[2].

**s = new int[row];
// s=[*] -> [*] -> [*] -> [?]
//          [?]    [?]    [?]
//          [?]    [?]    [?]
// More of the same. s[0][0] is initialized.
// This last array contains uninitialized ints, not pointers.

***s = 1;
// s=[*] -> [*] -> [*] -> [1]
//          [?]    [?]    [?]
//          [?]    [?]    [?]
// We traverse three levels of pointers (->) and store 1 in the cell.

これらすべてがコンパイルされ、正常に動作するはずです (初期化されていない要素にアクセスしない限り)。


s + 1最初の配列の 2 番目の要素を指します。

// s=[*] -> [*] -> [*] -> [1]
// s + 1 -> [?]    [?]    [?]
//          [?]    [?]    [?]

*(s + 1)は、上の図で が指すセルを[?]指します。s + 1このセルは初期化されていません。

**(s + 1)ガベージ ポインターを逆参照しようとしますが、これは無効です (そしてしばしばクラッシュします)。

于 2015-09-07T03:40:02.563 に答える