这两个函数都试图返回指针数组。两者都是这样做是错误的并且无法在我的系统上编译。
除了当它是sizeof
或一元&
运营商的操作数,或是使用在声明初始化字符数组文本字符串,类型“的T
N元件阵列”的表达将被转换(“衰减”)转换为类型为“指向T
的指针”的表达式,并且表达式的值将是该数组的第一个元素的地址。
在transpose
函数中,我们返回表达式trans
。 trans
具有类型“012-的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
具有类型“的double
10元件阵列的10个元素的阵列”,其中“衰减”到“指针至10个元素的数组的double
” (double (*)[10]
)。第二个函数具有正确的返回类型 - double (*)[10]
- 但他们搞砸了由return语句铸造c
到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
,这意味着它们的生命周期遍及整个程序,而不仅仅是它们各自功能的生命周期。没有那个static
关键字,他们在它们的封闭函数返回后不再存在,那些指针将变为无效。
这不一定是好的做法 - 这些功能不再是可重入的,也不是线程安全的。最好将目标数组作为参数传递给函数,但请注意,指向10元素数组的指针与指向11元素数组的指针是不同的,不兼容的类型 - 如果必须处理数组不同数量的列,这可能会变得棘手。沃拉斯可以与帮助:
void transpose(int r, int c, double arr[r][c], double trans[c][r])
{
...
}
假设你有VLAS可用(你应该对C99和C2011系统,虽然他们已经在C2011已经取得可选)。如果你不......这会变得更加困难。
'double **'是**不是**二维数组,并且不能指向一个。指针不是数组。不,你不能将数组传递给函数。但是你可以传递指向数组的指针。 – Olaf