多次元配列と多次元ポインタ

11921 ワード

ソースこれの配列ポインタに関する問題は、これ2これを参照して、次のテストを行います.
#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の倍数である必要があるようだ.