2013年08月09日

配列とポインタ

よく間違える配列のポインタをメモ


int array[4][5]
「要素5個の配列」の要素4個の配列
1.int型要素20個が連続して確保されている
(2.Fortranとかでは配列要素外にアクセスできないはずだけど,C++ではポインタ的にアクセスできる.)

で,
&array:配列全体の先頭を示すポインタ
&array[0]:配列の先頭要素を示すポインタ.単にarrayと書いても良い(&array[0]に置き換えてくれる?)
array:&array[0]を示す場合もあれば,配列全体を示す場合も.
->sizeof(array) == sizeof(int)*4*5 != sizeof(&array[0])
この場合では,左2個は20B,右は4B.

なので,
int array[N][M];
...
sizeof(array);
としていたのを,

int **a= new int *[4];
for(i= 0; i < 4; i++){
a[i]= new int [5];
}
for(i= 0; i < 4; i++){
cout << a[i] << endl;//連続していないないよ
}

とすると,sizeof(a)はポインタの大きさを返す.

配列のアドレスが連続している必要性がある場合には,以下.

int (*b)[5]= new int [4][5];
for(i= 0; i < 4; i++){
cout << b[i] << endl;
for(j= 0; j < 5; j++){
b[i][j]= array0[i][j];
}
}
for( i= 0; i < 4; i++){
for(j= 0; j < 5; j++){
cout << b[i][j] << endl;
}
}
cout << sizeof(b) << endl;




使い道は分からないけど,
配列要素がアドレスに対して連続して確保されており,配列要素が範囲外でもポインタ的に動作するので,

int array0[4][5];
int i= 2, j= 3;
array0[i][j]= 23;
cout << array0[0][i*5+ j] << endl;

も一応できる.



for(i= 0; i < 4; i++){
cout << array0[i] << endl;
}

とすれば,sizeof(int)[B]*5=20B=x14づつアドレスが増えている.


配列を引数としても渡せる.が,ポインタを渡しているだけなので注意.
Privateメンバ変数なんかは無理かも?

for(i= 0; i < 4*5; i++){
array0[0][i]= i;
}
func(array0);
cout << array0[0][0] << endl;

void func(int (*a)[5])
{
cout << a[1] << endl;
for( int i= 0; i < 4; i++){
for(int j= 0; j < 5; j++){
cout << a[i][j] << endl;
a[i][j]++;
}
}
return;
}

ここで,aは「int型5個配列」の先頭を示すポインタ.int x[][5]としてもOK
posted by にゃんこ at 16:19| Comment(0) | C++
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]