当前位置:  开发笔记 > 编程语言 > 正文

参考C中的二维数组列?

如何解决《参考C中的二维数组列?》经验,为你挑选了1个好方法。

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

double doSomethingWithARow( double theRow[3] );
double doSomethingWithACol( double theCol[100] );

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

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] );
}

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

for( int j=0; j < 3; j++ )
{
   result = doSomethingWithACol( ??????????? );
}

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



1> Stephan202..:

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

 double doSomethingWithACol(double *matrix, size_t colID, size_t rowSize, size_t nRows);

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

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

 double doSomethingWithACol(double *colPtr, size_t rowSize, size_t nRows);

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


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

#include 
#include 

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;
}

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有