这个代码有一个概念错误 - 数组表达式可能不是一个赋值的目标。如果试图写
void func1(void)
{
mat bbb;
bbb = aaa;
bbb[1][2] = 3;
}
编译器将抛出的诊断上的表达bbb = aaa
(GCC“中分配不兼容的类型”诊断给出,因为aaa
被转换为指针类型;低于更多)。通过传递bbb
到func2
你试图做的事情实际上是同样的事情,并且最终不会起作用。
让我们摆脱了类型定义的,所以我们可以看到实际的类型涉及
double aaa[MAX_SIZE][MAX_SIZE];
...
void func2(double (*ccc)[MAX_SIZE])
{
ccc = aaa;
}
void func1()
{
double bbb[MAX_SIZE][MAX_SIZE];
func2(bbb);
bbb[1][2] = 3;
}
除非是sizeof
或一元&
运营商的操作数,或者是一个字符串用来初始化另一个阵列一个声明,类型为“T
的N元素数组”的表达式将被替换为“指向T
”类型的表达式,其值是该数组的第一个元素的地址。当你调用func2
,表达bbb
从类型“MAX_SIZE
阵列MAX_SIZE
阵列的double
的”转换为“指针MAX_SIZE
阵列的double
”;因此ccc
的声明为double (*ccc)[MAX_SIZE]
。
类似地,在func2
线ccc = aaa
,表达aaa
从double [MAX_SIZE][MAX_SIZE]
类型转换为double (*)[MAX_SIZE]
。
到目前为止,func2
是犹太教,因为ccc
是一个指针表达式,而不是一个数组表达式,所以赋值是允许的。 ccc
也恰好是从bbb
(其接收到的指针值的副本bbb
计算结果为)一个完全不同的实体,所以写入ccc
对bbb
没有影响。如果试图通过传递指针来解决,要bbb
,像这样:
void func2(double (*ccc)[MAX_SIZE][MAX_SIZE])
{
*ccc = aaa;
}
void func1(void)
{
double bbb[MAX_SIZE][MAX_SIZE];
func2(&bbb);
bbb[1][2] = 3;
}
编译器会把这个诊断上*ccc = aaa
,或者是因为*ccc
有数组类型,或者是因为类型的*ccc
和aaa
不兼容(请记住,aaa
转换为指针表达式)。
将数组传递给函数作为参数并不是一个好习惯。它们被作为指针传递和长度(一个或多个)丢失 - 这让你通过长度(一个或多个),也为自变量(一个或多个)。 – Rolice 2012-01-05 19:21:35