对成员引用和指针运算符的功能有些担忧..
采用以下示例:
struct ID{
uint8_t index;
bool active;
}
struct Square{
struct ID shortID;
struct BUDDY *bud;
uint8_t x;
uint8_t y;
};
然后我后来返回指向方块的指针.. 我的问题是:我可以修改ID的成员并将更改反映在嵌套结构中吗?
void function1()
{
Square *someSquare = GetSquare(1);
someSquare->shortID.index = 89; // Is this now reflected everywhere? OR was the shortID struct only modified in the scope of this funciton..
}
void function2()
{
Square *someSquare = GetSquare(1);
if ( someSquare->shortID.index != 89 )
{
// Dang...
}
}
谢谢!
修改
感谢简明的答案,是的,GetSquare函数返回指向正方形数组的指定索引的指针。像这样:
Square* GetSquare( uint8_t index )
{
return &squares[index];
}
因此实例应该每次都相同,因为“square”数组在创建对象时被分配一次。所以,谢谢你的见解我的问题必须在我的代码的其他地方:)
答案 0 :(得分:2)
是的,因为someSquare是Square*
->
运算符就像(*varname).
。
所以它是指针的内容,你得到类型Square
。
然后你可以用.
修改变量,因为它的结构和所有变量都是公共的,不像它可能在类中。
如果GetSquare
返回相同的对象(如果您的GetSquare
看起来像这样),则可以在function2中看到您在function1中所做的更改。
Square * GetSquare(int i)
{
static Square * pSquare = 0;
if (pSquare)
pSquare = malloc(sizeof(static Square));
return pSquare;
}
或者像这样的全局变量
static Square pSquare ;
Square * GetSquare(int i)
{
return &pSquare;
}
答案 1 :(得分:1)
如果function1中的Square指针指向与function2中的Square指针相同的Square,则是,您将看到function2中function1中设置的值(假设函数在该序列中被调用)。
如果指针指向不同的实例,您将看不到该值。
正如juanchopanza所指出的,这完全取决于你的GetSquare功能。请发布该功能的定义。
答案 2 :(得分:0)
它将在范围内,因为您没有使用任何形式的全局实例。我不知道getSquare实际上做了什么,但我假设它实例化了Square类并返回实例......
答案 3 :(得分:0)
访问someSquare->someID.index
就像访问someSquare->x
一样 - 在两种情况下都会修改someSquare
指向的对象(在第一种情况下,它正在修改子对象)。
答案 4 :(得分:0)
是的,如果GetSquare(1)返回相同的实例,那么更改也应该反映在function2()中。 如果要确保返回的实例是相同的,请尝试通过以下语句打印指针someSquare的值:
printf("Value of pointer: %p \n",someSquare);
如果此值相同,则表示它们是相同的实例,并且更改应反映在function2()中。
GetSquare也应该是任何类或静态函数之外的全局函数。如果它是实例函数,那么它将访问不同类对象的类“Square”的不同数组。
除此之外,我无法根据可用的代码给出另一种意见。