7
                         |--------|     
//                     / |4  4  4 |     
//                   |--------| 4 | 
//                 / |3  3  3 | 4 | 
//               |---------|3 |   |
//             / | 2  2  2 |3 | /
//            |---------|2 |__|
//            | 1  1  1 |2 | /
//            | 1  1  1 |__| 
//            | 1  1  1 | /
//            |_________|
double arr[4][3][3] = {{1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2},{3,3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4,4}};

この配列は4つの層で構成されていると思います。

配列のレイヤーへのポインターを作成し、ポインターを使用してその配列のレイヤーをトラバースしたいと思います。

私は試してみます:

double (*pp1)[sizeof(arr[0]) / sizeof(ar[0][0][0])]; 
pp1 = arr[0]; 

そして、intelIsenseからエラーを取得します:タイプの値(double(*)(3)はdouble(*)(9)に割り当てることができません

4

3 に答える 3

1

だからあなたがそうするなら:

int i;
double arr[4][3][3] = {{1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2},
                       {3,3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4,4}};

double (*pp3)[3][3];    
pp3 = arr;    
for (i = 0; i <= 3; i++)    
{   printf("pp3 + %d is %f \n", i, ***(pp3 + i));
}   

次に、目的の動作を取得します。コードの問題は、コンパイラーが指示しているように、9 doubleの配列にポインターを割り当てようとしている(double (*pp1)[sizeof(arr[0] / sizeof(arr[0][0][0])]と評価されるdouble (*pp1)[9])が、3の配列の3の配列へのポインターが必要なことです。で宣言したものですdouble arr[4][3][3]。私のテストから、gccはコンパイラの警告とともにを受け入れdouble (*pp1)[9]ます。これは、以下のコメントで取得しようとしたものです。それが物事をクリアすることを願っています。

この一般的なものを維持したい場合、本当に必要なのはdouble (*pp3)[sizeof(arr[0]) / sizeof(arr[0][0])][sizeof(arr[0][0]) / sizeof(arr[0][0][0])]、血まみれの悪夢です。

編集:間接参照を忘れました...ハハをコピー/貼り付けする必要があります。また、質問のコードの動作に関する説明を追加しました。コメントごとに修正。

于 2012-09-14T11:44:47.800 に答える
0

与えられたレイヤーの最初の要素の方向を単純に取得してみませんか?

double *pp1 = &ar[0][0][0];
double *pp2 = &ar[1][0][0];
/* and so on */
于 2012-09-14T10:33:13.623 に答える
0

この問題を理解しようとしているときに、いくつかの結果が得られました。

次のステートメントでコンパイラからエラーが発生しないことがわかりました

double arr[4][4][9];
double (*pp3)[9];
pp3 = arr[0];

では、上記のコードから、ポインターが指す要素の数が配列の最小次元と等しい場合にのみポインターを配列に割り当てることができると推測するのは正しいでしょうか?

更新:ポインターは配列の最小レイヤーにのみ作成できると思います。

誰かがこれを説明できますか?

于 2012-09-14T10:29:26.320 に答える