传递矩阵的COLUMN以起作用

问题描述 投票:2回答:2

我有一个关于将矩阵的单列传递给函数的问题。我只需要操作整个矩阵的一列,但我似乎不知道如何做到这一点。我在网上寻找答案,但似乎没有人有这个问题。谢谢你的想法!

c parameter-passing
2个回答
0
投票

如果您只需要偶尔处理来自一列的数据,那么只需传递整个矩阵,并在需要时简单地处理单列数据。如果您经常需要处理单列数据,则必须使用实用程序函数来提取单列数据,因为在C中,任何数组(包括数组数组)都只是一块内存。 C没有任何行和列的概念;你必须为自己这样做。

与大多数这样的实用程序函数一样,有许多方法可以实现目标,实际实现更多地取决于您需要如何使用结果而不是获取结果的任何特定方式。一种方法是这样的:

#include <stdlib.h>
#include <stdio.h>

#define NUM_COLS 3
#define ERR_OUT_OF_RANGE 1
#define ERR_NOMEM -1

int get_matrix_column(int (*matrix)[NUM_COLS], int nRows, int iCol, int **result) {
  if (iCol < 0 || iCol >= NUM_COLS) return ERR_OUT_OF_RANGE;

  *result = malloc(sizeof(int) * nRows);
  if (*result == NULL) return ERR_NOMEM;

  for (int i = 0; i < nRows; i++) {
    (*result)[i] = matrix[i][iCol];
  }
  return 0;
}

int main(void) {
  int matrix[4][3] = { {2, 3, 4}, {7, 8, 9}, {0, 1, 2}, {5, 6, 7} };
  int *col = NULL;
  int rc = get_matrix_column(matrix, 4, 1, &col);
  if (rc)
    puts("Error getting column");
  else
    for (int i = 0; i < 4; ++i) {
      printf("%d ", col[i]);
    }
  free(col);
  return 0;
}

此版本处理使用自动存储中的显式边界定义的矩阵(堆栈上的AKA)。当传递给函数时,这种数组的指针衰减导致与单个元素数组略有不同的签名。使用NUM_COLS宏常量是因为这样的声明中的最终维度必须是常量。

同样,这只是许多方法中的一种方式。重点是,如果你只想要一个列的值,你必须自己去获取它们,因为C完全不知道你在说什么。


0
投票

传递整个阵列无需任何费用。然后,您只能操作列数据。如果每行中的列大小不同,您可能需要查看:

2d dynamic array (in C) with specific row number and different column size in each row

© www.soinside.com 2019 - 2024. All rights reserved.