2D配列の名前は、1D配列のようにCでベースアドレスを与えますか? また、2次元配列のベースアドレスをポインター変数に格納するにはどうすればよいですか?
5 に答える
最初の要素へのポインターに減衰します。
int a[5][7];
に崩壊する
int (*pa)[7] = a;
実際には、 に格納される値は の最初の要素へのポインターの値pa
と同じになりますが、 の最初の要素へのポインターを取得する正しい方法は、int
a
a
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を参照
はい、あなたはアドレスを次のように保存します:
int *p = &a[0][0];
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]);
base のオフセットを指すには、operatorのアドレスを使用します。
char base[2][2];
int *basepointer = &base;