3

Cの基本的な概念を理解しようとしています。2つの質問があります。

1.次のコードが機能し、他のコードが機能しないのはなぜですか?

/* This works fine */
typedef int SortTableRows[20]; 

SortTableRows* SortTableRowsPtr;

/* This will give error --> subscripted value is neither array nor pointer*/
int SortTableRows[20]; 

SortTableRows* SortTableRowsPtr;
  1. 2番目の質問は、コードの3行目が何をしているのかということです。

    typedef int SortTableRows[20]; 
    
    SortTableRows* SortTableRowsPtr;
    
    SortTableRowsPtr[2][3]=2; //Why the compiler doesnt give any error?how can we use a     pointer as a 2d array. 
    
4

2 に答える 2

3

withSortTableRowsの配列になるように定義しました。その識別子は現在、配列として固定されており、他の目的には使用できません。次に、それを型として使用してポインターを宣言しようとしています (私は思います)。int の配列へのポインターを宣言する場合は、次のようにします。intsint SortTableRows[20]

int *SortTableRowsPtr;
SortTablesRowPtr = SortTablesRows;

2 番目の質問では、2 次元配列として扱っているポインターへのポインターに値を代入していますが、これはコンパイラーにとって実質的な違いはありません (ただし、このコンテキストでは意味がありません)。多次元配列は、1 次元配列と同じように線形にメモリに格納されます。配列typedefの型を定義してから、それへの初期化されていないポインタを作成し(これにより が作成されますint **)、有効なものを指しているかのようにアクセスします(これはコンパイルされますが、確実にクラッシュします)。

これを機能させるには、20 個の int の配列を定義してから、それを指す必要があります。

SortTablesRows table[10] = {};  // equivalent to int table[10][20];
SortTablesRowPtr = table;

これは、20 個の int の配列へのポインターを宣言しているためです。つまり、

int (*SortTablesRowPtr)[20];

この回答を拡張しました。ステップバイステップでより簡単に説明するのに役立ちます。3 行 10 列のテーブルを考えてみましょう。それは定義されています:

int table[3][10];

次に、このテーブルへのポインタを設定できます。2 次元であるため、これは正しくありません。

int *ptr = table; // wrong - incompatible pointer

ただし、これは 2 行目 (および最初の列) を指します。

int *ptr = table[1];

つまり、10 個の int の配列へのポインターが必要です。つまり、型を指すポインターが必要ですint n[10]。これを行うには、次のように記述できます。

int (*ptr2)[10] = table;

ptr2を使用して、ポインター、配列、またはその両方としてテーブルに直接アクセスできるようになりました。現状では、最初の行と最初の列を指しています。1 つ追加するptr2と、次の行が選択されます。

ptr2[1][3] = 3;  // change row 2, column 4
(*(ptr2 + 1))[4] = 10 // row 2, column 5 (yuck)
于 2013-03-06T23:41:49.427 に答える
3

質問1。

最初に、SortTablesRow が 20 個の int の配列であることを伝えています。したがって、SortTablesRow は型です。2 番目の例では、20 個の int の配列である SortTablesRow という変数を作成しています。これは変数であるため、型として使用できません。

質問2。

ここでは、SortTablesRow を 20 個の int の配列として型定義しています。次に、SortTablesRowPtr はそれへのポインターであると言います。これで、20 個の int の配列へのポインターができました。これは基本的に int** です。したがって、最初の配列インデックスは最初のポインターにインデックスを付け、2 番目の配列インデックスは 2 番目のポインター (または配列) にインデックスを付けて、20 要素の int 配列を検索します。

于 2013-03-06T23:43:44.157 に答える