函数中的C指针

时间:2012-01-05 19:10:00

标签: c pointers

在我的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,但他们不会。{/ p>

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

4 个答案:

答案 0 :(得分:1)

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

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

并像这样编辑func2

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

答案 1 :(得分:0)

您的类型mat不是指针类型,它是一个数组。您无法在C中分配数组变量。解决问题的常用方法是使用指针:

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

答案 2 :(得分:0)

您的意思是,bbb[1][2] = 3;将在aaa完成?然后你必须这样做:

mat aaa;

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

答案 3 :(得分:0)

此代码中存在概念错误 - 数组表达式可能不是赋值的目标。如果你试着写

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

编译器会对表达式bbb = aaa抛出一个诊断(gcc给出“赋值不兼容的类型”诊断,因为aaa被转换为指针类型;更多内容见下文)。通过将bbb传递给func2,您尝试做的事情实际上是相同的,并且最终无法发挥作用。

让我们摆脱typedef,这样我们就能看到所涉及的实际类型

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或一元&运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则表达式为“N-element array of { {1}}“将被替换为类型为”T的指针“的表达式,其值是数组的第一个元素的地址。当您致电T时,表达式func2会从bbb MAX_SIZE MAX_SIZE数组double数组转换为“指向MAX_SIZE的指针数组double“;因此ccc声明为double (*ccc)[MAX_SIZE]

同样,在ccc = aaa中的func2行中,表达式aaa已从类型double [MAX_SIZE][MAX_SIZE]转换为double (*)[MAX_SIZE]

到目前为止,func2是Kosher,因为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上抛出诊断,因为*ccc具有数组类型,或者因为aaaaaa的类型不兼容(请记住,{{ 1}}转换为指针表达式)。