是否可以从 C 中的二维数组中切出一列

Is it possible to slice a column from 2d array in C

当我希望从 c 中的二维数组中切出一行时,我可以执行以下操作:

void PrintArray(int *arr, int arr_size);
int main(){
    int arr[4][4] = {
            {10, 13, 56, 66},
            {23, 57, 59, 67},
            {36, 70, 74, 75},
            {40, 75, 80, 91}
    };
    PrintArray(arr[2], 4);
    return 0;
}

void PrintArray(int *arr, int arr_size) {
    int i;

    for (i = 0; i < arr_size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

打印:

36 70 74 75

我想知道是否有可能以某种 elegant/efficient 方式按列执行相同的操作。

我可以转置矩阵并执行相同的操作,但这样做很麻烦。

注:

我怀疑这可能不可能,但我想知道是否有更有根据的答案来回答是否可能。

如果将数组转换为 (int*),则可以定义此函数:

void PrintCol (int *arr, int col, int row_size, int arr_size) {
    int i;
    for (i = col; i < arr_size; i += row_size) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

并这样称呼它,假设您要打印列偏移量 1。

PrintCol((int*)arr, 1, 4, 16);

谁的输出应该是这样的:

$ gcc slice.c && ./a.out
13 57 70 75

您应该做的一件事是将 PrintArray for 循环与 PrintCol.

中的循环进行比较

生成的程序集之间的唯一区别应该是 i 初始分配方式和 i 递增方式的说明。

从这个意义上说,PrintArray 确实更有效率,但幅度不大。 “转置矩阵加 PrintArray”的成本总是(?)大于“PrintCol”。

不存在这样优雅或有效的方法,因为数组本质上是原始内存,而矩阵是应用层概念。

碰巧可以通过让数组编号 n 衰减为指向第一个元素的指针来访问 4 int[4] 个数组,因为这就是方法项目保证在内存中布局(从 LS 地址到 MS 地址,“从左到右”)。但是没有特别优雅的技巧来做相反的事情,除了使用 arr[i][j].

访问每个数组项之外

值得注意的是,您可以选择在应用程序层上创建矩阵 mat [row][col]mat[col][row]。数组数组的最左边 dimension/index 不一定必须对应于应用程序中矩阵的数学定义。