1

2D配列の名前は、1D配列のようにCでベースアドレスを与えますか? また、2次元配列のベースアドレスをポインター変数に格納するにはどうすればよいですか?

4

5 に答える 5

3

最初の要素へのポインターに減衰します。

int a[5][7];

に崩壊する

int (*pa)[7] = a;

実際には、 に格納される値は の最初の要素へのポインターの値paと同じになりますが、 の最初の要素へのポインターを取得する正しい方法は、intaa

int *p_elm = &(a[0][0]);

または同等に

int *p_elm = &(pa[0][0]);

ただし、最初の要素へのポインターは (厳密には)N*M配列の先頭へのポインターとして扱うことができないことに注意してください。例えばhttp://www.lysator.liu.se/c/c-faq/c-2.html#2-11を参照

于 2012-06-18T08:59:58.677 に答える
2

はい、あなたはアドレスを次のように保存します:

int *p = &a[0][0];
于 2012-06-18T09:01:45.833 に答える
2

2D 配列は本質的に 1D 配列であり、各要素自体が配列です。

配列の名前は &arrayName[0] と同等です。

このアドレスへのポインターの割り当ては、いつもと同じで、次のようになります。

int myArray[5][5];
int (*arrayptr)[5] = myArray;

これはarrayptr、5 つの整数の配列へのポインタです。myArrayは である最初の要素へのアドレスであるため、int[5]宣言は問題ありません。

ただし、このポインターを逆参照すると、最初の要素である配列が取得されます。したがって、次のようなことができます:

(*arrayptr)[3]; // parens necessary for precedence issues

「外部配列」の最初の要素内にネストされた配列の 3 番目の要素にアクセスします。それは

myArray[0][3];

何が起こっているかとarrayptrいうと、1D 配列 (この場合はサイズ 5) を生成する逆参照を行っているということです。次に、この 1D 配列の 4 番目の要素を求めています。

ここで、探しているのがマトリックスの左上の「コーナー」である場合は、次のようになります。

int *topleft = &(myArray[0][0]);
于 2012-06-18T09:02:31.397 に答える
0

base のオフセットを指すには、operatorのアドレスを使用します。

char base[2][2];
int *basepointer = &base;
于 2012-06-18T09:06:57.180 に答える