繁体   English   中英

C编程 - 在使用多维数组的函数中使用的指针

[英]C programming - pointers used in functions that work with multidimensional arrays

我有以下两个功能:

double** transpose(double **a, int r, int c){
    static double trans[100][100];
    int i,j;
    for(i = 0; i < r; i++)
        for(j = 0; j < c; j++)
            trans[j][i] = a[i][j];
    return trans;
}

double(*matrixMultiply(double a[10][10], double b[10][10],
    int rowA, int colB, int colARowB))[10]{
    static double c[10][10];
    int i, j, k;
    for(i = 0; i < rowA; i++)
        for(j = 0; j < colB; j++){
            c[i][j] = 0;
            for(k = 0; k < colARowB; k++)
                c[i][j] += a[i][k]*b[k][j];
        }
    return (double*) c;
}

虽然我理解算法,有人可以解释一下这两个函数返回的内容(类型,指针......)? 第二个似乎返回一个数组,但我认为C中的函数不能返回数组...

真的对这些指针感到困惑......

为什么数组( transc )声明为静态? 据我所知,当你用静态声明一个变量或一个函数时,它不能被导入以便在另一个文件中使用,但这在某种情况下并非如此......

这两个函数都试图返回指向数组的指针。 两者都做错了 ,无法在我的系统上编译。

除非它是sizeof或一元&运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则将将“N元素数组T ”的表达式转换为(“衰减”)到表达式“指向T指针”,表达式的值将是数组的第一个元素的地址。

transpose函数中,我们返回表达式 trans trans具有类型“ T 100个元素数组”,其中T是“100个元素的double数组”。 它不是sizeof或一元&运算符的操作数,因此它被转换(“衰减”)到“指向T指针”类型的表达式,在这种情况下是“指向100个元素的double精度数组”( double (*)[100] ),而不是 “指向double指针的指针”,( double ** )。

编译器应该抱怨该功能。 我的确如此:

gcc -c -std=c99 -pedantic-errors -Wall transpose.c
transpose.c: In function âtransposeâ:
transpose.c:7: error: return from incompatible pointer type

matrixMultiply函数中, c具有类型“10元素数组的double元素10元素”,其“衰减”为“指向double元素的10元素数组”( double (*)[10] )。 第二个函数具有正确的返回类型- double (*)[10] -但他们搞砸了铸造cdouble *在return语句,我们得到了相同的错误面前:

gcc -c -std=c99 -pedantic-errors -Wall matrixMultiply.c
matrixMultiply.c: In function âmatrixMultiplyâ:
matrixMultiply.c:11: error: return from incompatible pointer type

他们应该刚写完

return c;

一切都会好起来的。

读取第二个函数定义的方法如下:

        matrixMultiply                           -- matrixMultiply
        matrixMultiply(                   )      -- is a function taking
        matrixMultiply( /* some params */ )      -- some parameters (omitted for brevity)
       *matrixMultiply( /* some params */ )      -- returning a pointer
      (*matrixMultiply( /* some params */ ))[10] -- to a 10-element array
double(*matrixMultiply( /* some params */ ))[10] -- of double

注意,函数有希望工作的唯一原因(一旦类型问题被理顺), transc都被声明为static ,这意味着它们的生命周期延伸到整个程序,而不仅仅是它们各自函数的生命周期。 如果没有那个static关键字,它们将在它们的封闭函数返回后停止存在 ,并且这些指针将变为无效

这不一定是好的做法 - 这些功能不再是可重入的,也不是线程安全的。 将目标数组作为参数传递给函数会更好,但要注意,指向10元素数组的指针与指向11元素数组的指针是不同的不兼容类型 - 如果必须处理数组使用不同数量的列,这可能会变得棘手。 VLA可以帮助解决这个问题:

void transpose( int r, int c, double arr[r][c], double trans[c][r] )
{
  ...
}

假设您有可用的VLA(您应该在C99和C2011系统上,尽管它们在C2011中已经可选)。 如果你不这样做......这会变得更难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM