多次元配列と多次元ポインタ
11921 ワード
ソースこれの配列ポインタに関する問題は、これ2これを参照して、次のテストを行います.
次の点に注意してください.
1.配列名はタイプ名であり、データ構造とすることができ、a[0]はint(*p)[n]がn次元配列を指すポインタと見なすことができる.
2.自分でスタックに割り当てた多次元ポインタで、各次元ポインタはスタックの中で一定の空間を占めている.
3.スタック内の多次元配列は線形に配列され、1つは1つ隣接しており、スタック内の配列はスタック内で順次排出され、排出されるヘッダアドレスは16の倍数である必要があるようだ.
#include <cstdio>
#include <time.h>
using namespace std;
void test() {
char *a = "abc";
printf("%08x %08x
", a, a + 1);
}
void test1() {
int **a = new int*[10];
for (int i = 0; i < 10; i++)
a[i] = new int[10];
for (int i = 0; i < 10; i++) {
printf("%08x %08x %08x
", a[i], a + i, &a[i]);
}
printf("
");
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++)
printf("%08x ", a[i] + j);
printf("
");
}
printf("%08x
", &a + 1);
}
void test2() {
int *a = new int[3];
int *b = new int[3];
for (int i = 0; i < 3; i++)
printf("%08x
", a + i);
for (int i = 0; i < 3; i++)
printf("%08x
", b + i);
}
void test3() {
int a[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
printf("%d
", sizeof(a));
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%08x ", &a[i][j]);
}
printf("
");
}
printf("%08x %08x %08x %08x %08x
", (int*)a[0] + 1, a[0] + 1, a[1], &a[1], a + 1);
printf("%08x %08x %08x %08x
", &a, &a[0], &a + 1, &a[0] + 1);
printf("%08x %08x %08x %08x
", &a, &a[0], (int **)&a + 1, (int *)&a[0] + 1);
int* t1 = (int *)(&a + 1);
int* t2 = (int *)t1 - 1;
//printf("%08x
", *((int*)(&a + 1) - 1));
//printf("%d
", (int *)((int *)a[3] - 1));
/*
int *ptr = (int *)(&a + 1);
printf("%d
", *(ptr - 1));
*/
}
void test4() {
int a[2][2][2] = {
{{1, 2}, {3, 4}},
{{5, 6}, {7, 8}}
};
int *b = (int *)a;
for (int i = 0; i < 8; i++) {
printf("%d ", b[i]);
}
}
void test5() {
struct A {
char a[3];
};
A a;
A* b = &a;
printf("%08x %08x %08x %08x
", &a, &a + 1, b, b + 1);
}
int main()
{
//test1();
//test2();
//test3();
//test4();
test5();
while (1);
}
次の点に注意してください.
1.配列名はタイプ名であり、データ構造とすることができ、a[0]はint(*p)[n]がn次元配列を指すポインタと見なすことができる.
2.自分でスタックに割り当てた多次元ポインタで、各次元ポインタはスタックの中で一定の空間を占めている.
3.スタック内の多次元配列は線形に配列され、1つは1つ隣接しており、スタック内の配列はスタック内で順次排出され、排出されるヘッダアドレスは16の倍数である必要があるようだ.