是否有一种简单的方法可以将二维数组中的列作为普通旧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语言引用指针的复杂方法,似乎应该有办法做到这一点.
好吧,你必须传递一行的大小和行数:
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; }