获取4维数组中子数组的指针

red*_*ria -1 c

我已经声明了一个4维数组: int board[3][3][3][3]

我怎样才能获得指向子数组的指针,例如我尝试过这样的事情:

int sub_board[3][3] = board[1][2];
Run Code Online (Sandbox Code Playgroud)

但它没有用,我找不到任何方法来获得指向子数组的指针.

chq*_*lie 6

有两种方法可以获得指向子数组的指针:

int (*sub_board)[3][3] = &board[1][2];
Run Code Online (Sandbox Code Playgroud)

sub_board指向具有已知维度的子数组,但其元素必须取消引用为(*sub_board)[i][j].

或者,您可以使用指向子数组开头的指针,但没有嵌入的元素数量概念:

int (*sub_array)[3] = board[1][2];
Run Code Online (Sandbox Code Playgroud)

元素更直观地访问sub_array[i][j],但i在编译时无法静态检查范围.

以下是这些工作原理的说明.为清楚起见,我使用了不同尺寸的不同尺寸:

#include <stdint.h>
#include <stdio.h>

int main(void) {
    int board[2][3][4][5];
    int (*sub_board)[4][5] = &board[1][2];
    int (*sub_array)[5] = board[1][2];
    int n = 0;

    for (int i0 = 0; i0 < 2; i0++) {
        for (int i1 = 0; i1 < 3; i1++) {
            for (int i2 = 0; i2 < 4; i2++) {
                for (int i3 = 0; i3 < 5; i3++) {
                    board[i0][i1][i2][i3] = n++;
                }
            }
        }
    }

    printf("board = %p\n", (void*)board);
    printf("sub array board[1][2] should be at offset 1 * 3 * 4 * 5 + 2 * 4 * 5 = %d\n",
           1 * 3 * 4 * 5 + 2 * 4 * 5);
    printf("sub_board = %p\n", (void*)sub_board);
    printf("offset    = %lld\n", (long long int)(((intptr_t)sub_board - (intptr_t)board) / (int)sizeof(int)));
    printf("sub_array = %p\n", (void*)sub_board);
    printf("offset    = %lld\n", (long long int)(((intptr_t)sub_array - (intptr_t)board) / (int)sizeof(int)));

    printf("addressing using board:\n");
    for (int i2 = 0; i2 < 4; i2++) {
        for (int i3 = 0; i3 < 5; i3++) {
            printf("%8d", board[1][2][i2][i3]);
        }
        printf("\n");
    }
    printf("\n");

    printf("addressing using sub_board:\n");
    for (int i2 = 0; i2 < 4; i2++) {
        for (int i3 = 0; i3 < 5; i3++) {
            printf("%8d", (*sub_board)[i2][i3]);
        }
        printf("\n");
    }
    printf("\n");

    printf("addressing using sub_array:\n");
    for (int i2 = 0; i2 < 4; i2++) {
        for (int i3 = 0; i3 < 5; i3++) {
            printf("%8d", sub_array[i2][i3]);
        }
        printf("\n");
    }
    printf("\n");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)