0

次の例のように、ポインターではないレイヤーに到達するまで、ポインターのさまざまなレイヤーを条件付きで逆参照することにより、C の n 次元配列の最下位レベル (非ポインター レベル) に到達できるかどうか疑問に思っていました。

if(i_is_a_pointer){
  for(i = 0; i < some_given_length; i++){
    if((*i)_is_a_pointer){
      for(j = 0; j < some_given_length; j++){
        if((**i)_is_a_pointer)...etc.
      }
    }
  }
}

これは、ポインター以外にヒットするか、書き込まれたコードの最後のブロックを使い果たすまで、配列を調べます。Cで、物がポインターであるかどうかを判断する方法はどうすればよいでしょうか(ターゲットの非ポインターがメモリアドレスとは異なるサイズである場合、sizeofが機能すると思います)、ステートメント ** i は次のようになります。 *i 自体がポインターでない場合、コンパイル時または実行時エラー?

さらに、実行時にnが決定されるn次元配列の非配列要素をトラバースするために、どの言語と手法を使用していますか/お勧めしますか?

4

1 に答える 1

4

C の多次元配列は、ご想像のとおり、最終レベルに到達するまでポインターの入れ子ではありません。それらは単なるデータのブロックです。外部次元は、特定のコンテキストで自動的にポインターに変換されます。配列は、最初の要素へのポインターに変換されます。例えば、

int a[3][4][5];

書くこともできます

typedef int INNER[5];    // array of 5 ints
typedef INNER MIDDLE[4]; // array of 5 INNERs (not pointers)
typedef MIDDLE OUTER[3]; // array of 3 MIDDLEs (not pointers)
OUTER a;

次に、これらは配列の同等のポインター変換でもあります。

MIDDLE *pm = a;
INNER *pi = a[0];
int *p = a[0][0];

int (*pm)[4][5] = a;
int (*pi)[5] = a[0];
int *p = a[0][0];

if最後に、C は静的に型付けされているため、ステートメントを処理しようとしているときに実行時に型を分析する方法や必要はありません。コンパイルされた C プログラムには、本質的に型情報は残っていません。

于 2012-06-15T19:48:54.047 に答える