構造体と多次元配列の理解
2206 ワード
C/C++構造体と多次元配列の理解は,指摘を批判してほしい.
構造体:実は普通のタイプ(int)と見なすことができて、関数のパラメータをする時、伝達に値します.
多次元配列の配列名と&配列名の理解:
1 D配列1 D配列1 D配列:配列名配列のヘッダ要素ヘッダアドレス、&配列名配列全体のヘッダアドレス
多次元配列:配列名1次元配列のヘッダアドレス、&配列名配列全体のヘッダアドレス
証明は次のとおりです.
1 D配列1 D配列1 D配列:配列名配列のヘッダ要素ヘッダアドレス、&配列名配列全体のヘッダアドレス
出力:
arr 1:2686784 arr 1+1:2686788位相差:4バイト
&arr 1:2686784&arr 1+1:2686792位相差:8バイト=2*4
2 D配列2 D配列2 D配列:配列名1 D配列のヘッダアドレス,&配列名配列全体のヘッダアドレス
出力:
arr 1:2686752 arr 1+1:2686764位相差:12バイト=3*4
&arr 1:2686752&arr 1+1:26866776位相差:24バイト=2*3*4
3 D配列3 D配列3 D配列:配列名1 D配列のヘッダアドレス(後の2 D配列と3 D配列を含む),&配列名配列全体のヘッダアドレス
出力:
arr 1:26866888 arr 1+1:2686736位相差:48バイト=3*4*4
&arr 1:2686688&arr 1+1:2686784位相差:96バイト=2*3*4*4
4 D配列4 D配列:配列名1 D配列のヘッダアドレス(後の2 D、3 D、4 D配列を含む)&配列名配列全体のヘッダアドレス
出力:
arr 1:268604 arr 1+1:2686544位相差:240バイト=3*4*5*4
&arr 1:268604&arr 1+1:2686784位相差:480バイト=2*3*4*5*4
N次元配列:配列名1次元配列のヘッダアドレス(後の2次元、3次元......N-1次元配列を含む),&配列名配列全体のヘッダアドレス
配列パラメータの等価なポインタパラメータの理解:
配列パラメータ等価ポインタパラメータ
1 D配列char a[30]ポインタ:char*a
ポインタ配列char*a[30]ポインタのポインタ:char*a
2 D配列char a[10][30]配列のポインタ:char(*a)[30]
データ型*ポインタ名は、コンパイラに、このポインタがどのようなデータ型のメモリを指しているのか、ポインタを操作するときに、そのポインタが指すメモリがどれだけのメモリを消費しているのかを知ることができますが、ポインタ自体は4バイト(sizeof)です.
構造体:実は普通のタイプ(int)と見なすことができて、関数のパラメータをする時、伝達に値します.
多次元配列の配列名と&配列名の理解:
1 D配列1 D配列1 D配列:配列名配列のヘッダ要素ヘッダアドレス、&配列名配列全体のヘッダアドレス
多次元配列:配列名1次元配列のヘッダアドレス、&配列名配列全体のヘッダアドレス
証明は次のとおりです.
1 D配列1 D配列1 D配列:配列名配列のヘッダ要素ヘッダアドレス、&配列名配列全体のヘッダアドレス
int main(int argc, char *argv[])
{
int arr1[2];
printf("arr1:%d arr1+1:%d
",arr1,arr1+1);
printf("&arr1:%d &arr1+1:%d
",&arr1,&arr1+1);
}
出力:
arr 1:2686784 arr 1+1:2686788位相差:4バイト
&arr 1:2686784&arr 1+1:2686792位相差:8バイト=2*4
2 D配列2 D配列2 D配列:配列名1 D配列のヘッダアドレス,&配列名配列全体のヘッダアドレス
int main(int argc, char *argv[])
{
int arr1[2][3];
printf("arr1:%d arr1+1:%d
",arr1,arr1+1);
printf("&arr1:%d &arr1+1:%d
",&arr1,&arr1+1);
}
出力:
arr 1:2686752 arr 1+1:2686764位相差:12バイト=3*4
&arr 1:2686752&arr 1+1:26866776位相差:24バイト=2*3*4
3 D配列3 D配列3 D配列:配列名1 D配列のヘッダアドレス(後の2 D配列と3 D配列を含む),&配列名配列全体のヘッダアドレス
int main(int argc, char *argv[])
{
int arr1[2][3][4];
printf("arr1:%d arr1+1:%d
",arr1,arr1+1);
printf("&arr1:%d &arr1+1:%d
",&arr1,&arr1+1);
}
出力:
arr 1:26866888 arr 1+1:2686736位相差:48バイト=3*4*4
&arr 1:2686688&arr 1+1:2686784位相差:96バイト=2*3*4*4
4 D配列4 D配列:配列名1 D配列のヘッダアドレス(後の2 D、3 D、4 D配列を含む)&配列名配列全体のヘッダアドレス
int main(int argc, char *argv[])
{
int arr1[2][3][4][5];
printf("arr1:%d arr1+1:%d
",arr1,arr1+1);
printf("&arr1:%d &arr1+1:%d
",&arr1,&arr1+1);
}
出力:
arr 1:268604 arr 1+1:2686544位相差:240バイト=3*4*5*4
&arr 1:268604&arr 1+1:2686784位相差:480バイト=2*3*4*5*4
N次元配列:配列名1次元配列のヘッダアドレス(後の2次元、3次元......N-1次元配列を含む),&配列名配列全体のヘッダアドレス
配列パラメータの等価なポインタパラメータの理解:
配列パラメータ等価ポインタパラメータ
1 D配列char a[30]ポインタ:char*a
ポインタ配列char*a[30]ポインタのポインタ:char*a
2 D配列char a[10][30]配列のポインタ:char(*a)[30]
データ型*ポインタ名は、コンパイラに、このポインタがどのようなデータ型のメモリを指しているのか、ポインタを操作するときに、そのポインタが指すメモリがどれだけのメモリを消費しているのかを知ることができますが、ポインタ自体は4バイト(sizeof)です.