2012-01-05 156 views
0

在我的C应用程序,我有以下声明:C指针函数

typedef double mat[MAX_SIZE][MAX_SIZE]; 

我也有一个全局变量:

mat aaa; 

在功能我要做到以下几点:

void func2(mat ccc) 
{ 
    ccc = aaa; 
} 

void func1() 
{ 
    mat bbb; 
    func2(bbb); 
    bbb[1][2] = 3; 
} 

我希望func2()之后的操作可以在bbb上影响全局变量aaa,但他们没有。

有关为什么行为不符合我的期望的任何建议?

+1

将数组传递给函数作为参数并不是一个好习惯。它们被作为指针传递和长度(一个或多个)丢失 - 这让你通过长度(一个或多个),也为自变量(一个或多个)。 – Rolice 2012-01-05 19:21:35

回答

1

您需要制作bbb指针并发送bbb的地址。

void func1() 
{ 
    mat *bbb; 
    func2(&bbb); 
    (*bbb)[1][2] = 3; 
} 

和编辑func2像这样:

void func2(mat **ccc){ 
    *ccc=&aaa; 
} 
+2

嗯,作为问题代表好像他想要的线'BBB [1] [2] = 3;'以某种方式影响'aaa'。因此,'bbb'必须有一个指针类型。另外,你的函数'func1'不会像你期望的那样工作。 – 2012-01-05 19:16:37

+0

* ccc = aaa;这是行不通的。数组不能通过这样的赋值来复制。 – 2012-01-05 19:16:52

+0

谢谢。我只注意到了这一点。编辑。 – 2012-01-05 19:22:44

0

你的类型mat是不是一个指针类型,它是一个数组。您不能分配给数组变量下的常用方法来解决你的问题是使用指针:

void func1(void) 
{ 
    mat *bbb = &aaa; 
    (*bbb)[1][2] = 3; 
} 
0

你的意思是,bbb[1][2] = 3;将在aaa做些什么呢?那么你将不得不这样做:

mat aaa; 

mat* func2() { 
    return &aaa; 
} 
void func1() { 
    mat* bbb = func2(); 
    (*bbb)[1][2] = 3; 
} 
+0

我编辑为使用正确的全局变量名称。希望你不介意。 – 2012-01-05 19:19:09

0

这个代码有一个概念错误 - 数组表达式可能不是一个赋值的目标。如果试图写

void func1(void) 
{ 
    mat bbb; 
    bbb = aaa; 
    bbb[1][2] = 3; 
} 

编译器将抛出的诊断上的表达bbb = aaa(GCC“中分配不兼容的类型”诊断给出,因为aaa被转换为指针类型;低于更多)。通过传递bbbfunc2你试图做的事情实际上是同样的事情,并且最终不会起作用。

让我们摆脱了类型定义的,所以我们可以看到实际的类型涉及

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,表达aaadouble [MAX_SIZE][MAX_SIZE]类型转换为double (*)[MAX_SIZE]

到目前为止,func2是犹太教,因为ccc是一个指针表达式,而不是一个数组表达式,所以赋值是允许的。 ccc也恰好是从bbb(其接收到的指针值的副本bbb计算结果为)一个完全不同的实体,所以写入cccbbb没有影响。如果试图通过传递指针来解决,要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有数组类型,或者是因为类型的*cccaaa不兼容(请记住,aaa转换为指针表达式)。