2011-03-11 118 views
0

我不知道我在做什么...结构和指针

让说我有一个结构

struct Inner{ 
    exampleType a; 
    int b; 
} 

struct Outer{ 
    int current; 
    int total; 
    Inner records[MAXNUMBER]; 
} 

struct Outer2{ 
    Outer outer; 
} 

和我有以下功能:

void try3(Outer2& outer, type var, type2 var2){ 
} 

void try2(Outer2* outer){ 
    try3(*outer, var, var2); 
} 

主要内部:

int myMain(int argc, char *argv[]){ 
    Outer2 outer2; 
    try2 (&outer2); 
} 

这里是任务离子。我可以坚持以下行try3增加的当前值:

++outer.outer.current; 
+4

你试过了吗? – 2011-03-11 02:18:25

+0

好吧,首先我没有在函数try3()的主体中看到名为outer2的任何符号... – julkiewicz 2011-03-11 02:20:08

+0

try3中没有'outer2'。你也从来没有初始化任何地方的任何整数。试着做你想做的事,然后看看会发生什么。 – 2011-03-11 02:22:05

回答

0

try3开始,您需要使用++outer.outer.current,因为outer是该点处变量的名称。要回答实际问题,请看这两个函数。 try2需要一个指向Outer2的指针,所以不需要复制。 try2将此传递给参考Outer2try3,因此不再进行复制。这意味着是的,++outer.outer.current实际上会影响在myMain中声明的原始outer2

编辑(每布赖恩的评论)

然而,outer.outer.current从未初始化,除非那不是你的真实myMain,如此以来,价值从未增量之前定义的current终值是不确定的。

+0

除了没有任何变量已经初始化,所以行为仍然是未定义的。 – 2011-03-11 02:28:01

+0

@Brian看到我上面的评论 – user470379 2011-03-11 02:29:09

+0

我相信你需要使用'outer.outer.current',因为'try3'中的'outer'需要一个'Outer2'对象叫做'outer',它也有一个名为'outer'的成员变量。 – dappawit 2011-03-11 02:29:23

2

errr,不,try3没有的事主叫outer2的知识。

你可以去outer.outer.current ++; in try3

+0

oops,我更正了我的帖子 – user618712 2011-03-11 02:24:20

1

当然可以,为什么不呢?这里是你的一个工作示例:

typedef short exampleType; 

struct Inner 
{ 
    exampleType a; 
    int b; 
}; 

struct Outer 
{ 
    enum { MAXNUMBER = 2 }; 

    int current; 
    int total; 
    Inner records[MAXNUMBER]; 
}; 

struct Outer2 
{ 
    Outer outer; 
}; 

typedef int type; 
typedef int type2; 

void try3 (Outer2& outer, type var, type2 var2) 
{ 
    ++outer.outer.current; 
} 

void try2 (Outer2* outer) 
{ 
    int var = 1, var2 = 2; 
    ++outer->outer.current; 
    try3(*outer, var, var2); 
} 

int main() 
{ 
    Outer2 outer2; 
    outer2.outer.current = 1986; 
    try2 (&outer2); 
}