Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 获取指向四维数组中子数组的指针_C - Fatal编程技术网

C 获取指向四维数组中子数组的指针

C 获取指向四维数组中子数组的指针,c,C,我已经声明了一个四维数组:int board[3][3][3] 如何获取指向子数组的指针,例如,我尝试了以下方法: int sub_board[3][3] = board[1][2]; 但是它不起作用,我找不到任何方法来获取指向子数组的指针。有两种方法可以获取指向子数组的指针: int (*sub_board)[3][3] = &board[1][2]; sub_board指向具有已知维度的子数组,但其元素必须作为*sub_board[i][j]取消引用 或者,您可以使用指向子数组开

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

如何获取指向子数组的指针,例如,我尝试了以下方法:

int sub_board[3][3] = board[1][2];
但是它不起作用,我找不到任何方法来获取指向子数组的指针。

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

int (*sub_board)[3][3] = &board[1][2];
sub_board指向具有已知维度的子数组,但其元素必须作为*sub_board[i][j]取消引用

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

int (*sub_array)[3] = board[1][2];
这些元素更直观地作为sub_数组[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;
}
如果要复制子阵列

int sub[3][3];
memcpy(sub, board[1][2], sizeof sub);
语法应为:

int (*sub_board)[3] = board[1][2];

你真的需要使用4D数组吗?对不起,我是个反对者,但你不觉得这篇文章在显示努力方面有点欠缺吗?数组不是指针。这就是为什么会出现错误。对于int板[3][5][7][9];董事会[1][7][9]=董事会[1][2];我得到:警告:从不兼容的指针类型初始化最有用的是int*sub_board[3]=board[1][2]。对于您的类型,您必须将address运算符添加到赋值的RHS中。@Olaf:我重新表述了我的答案,以澄清不同的选项。OP想要子数组,而不是子数组的子数组。实际上,问题并不是100%清楚OP想要什么。这个答案提供了一个指针,用于两个附加索引,例如int xx=sub_board[3][2];。