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

时间:2017-04-05 16:31:56

标签: c arrays pointers multidimensional-array

我有以下两个功能:

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)声明为静态?据我所知,当你用静态声明一个变量或一个函数时,它不能被导入以便在另一个文件中使用,但这在某种情况下并非如此......

1 个答案:

答案 0 :(得分:3)

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

除非它是sizeof或一元&运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,表达式为类型&#34; T&#34;的N元素数组;将被转换(&#34;衰减&#34;)到类型为&#34的表达式;指向T&#34;的指针,并且表达式的值将是第一个元素的地址。阵列。

transpose函数中,我们返回表达式 transtrans类型为&#34;包含T&#34;的100个元素数组,其中T为&#34; 100个元素数组double&#34 ;。它不是sizeof或一元&运算符的操作数,因此它被转换(&#34;衰减&#34;)到类型为&#34的表达式;指向{的指针{1}}&#34;,在这种情况下是&#34;指向T&#34;的100个元素数组的指针(double), NOT &#34;指针指向double (*)[100]&#34;,(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具有类型&#34; 10个元素的10个元素数组c&#34;,其中&#34;衰变&# 34; to&#34;指向double&#34;的10元素数组; (double)。第二个函数具有正确的返回类型 - double (*)[10] - 然后通过将double (*)[10]投射到c MESS IT UP return语句,我们得到与以前相同的错误:

double *

他们刚写完

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 trans都被声明为c,这意味着它们的生命周期延伸到整个程序,而不仅仅是它们各自功能的生命周期。如果没有static关键字,它们将在其封闭函数返回后停止存在,并且这些指针将变为无效

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

static

假设您有可用的VLA(您应该在C99和C2011系统上,尽管它们已在C2011中成为可选项)。如果你不......那就变得更难了。