参考C中的二维数组列?

Kei*_*h G 4 c arrays

是否有一种简单的方法可以将二维数组中的列作为普通旧C(不是C++或C#)中的单独1-D数组引用?这样做很容易.Asssume我有2个功能:

double doSomethingWithARow( double theRow[3] );
double doSomethingWithACol( double theCol[100] );
Run Code Online (Sandbox Code Playgroud)

然后,我可能会像这样使用第一个:

double matrix[100][3];
double result;

// pass a single row to a function as an array
// this essentially passes the 3-element array at row 48 to the function
for( int i=0; i < 100; i++ )
{
   result = doSomethingWithARow( matrix[i] );
}
Run Code Online (Sandbox Code Playgroud)

我想要一种轻松访问列的方法.

for( int j=0; j < 3; j++ )
{
   result = doSomethingWithACol( ??????????? );
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我唯一想到的就是转换矩阵以将行与列交换.但是这个代码应该在内存和速度方面尽可能高效.有了所有用C语言引用指针的复杂方法,似乎应该有办法做到这一点.

Ste*_*202 5

好吧,你必须传递一行的大小和行数:

 double doSomethingWithACol(double *matrix, size_t colID, size_t rowSize, size_t nRows);
Run Code Online (Sandbox Code Playgroud)

现在你可以利用矩阵[i] [j] =矩阵+ i*rowSize + j的事实;

或者,您也可以使用以下签名:

 double doSomethingWithACol(double *colPtr, size_t rowSize, size_t nRows);
Run Code Online (Sandbox Code Playgroud)

在这里,您必须将指针传递给要处理的列的第一个元素,而不是指向第一行的指针.


示例代码:此代码对第二列中的元素求和(使用gcc -o main -Wall -Wextra -pedantic -std = c99 test.c编译):

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

double colSum1(double *matrix, size_t colID, size_t rowSize, size_t nRows)
{
  double *c = NULL, *end = matrix + colID + (nRows * rowSize);
  double sum = 0;

  for (c = matrix + colID; c < end; c += rowSize) {
    sum += *c;
  }

  return sum;
}

double colSum2(double *colPtr, size_t rowSize, size_t nRows)
{
  double *end = colPtr + (nRows * rowSize);
  double sum = 0;

  for (; colPtr < end; colPtr += rowSize) {
    sum += *colPtr;
  }

  return sum;
}

int
main(void)
{
  double matrix[4][3] = {
    {0,  1, 2},
    {3,  4, 5},
    {6,  7, 8},
    {9, 10, 11}
  };

  printf("%f\n", colSum1(*matrix, 1, 3, 4));
  printf("%f\n", colSum2(&matrix[0][1], 3, 4));
  printf("%f\n", colSum2(matrix[0] + 1, 3, 4));

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