"."和"->"操作员的混合链
Mixing chains of "." and "->" operators
对成员引用和指针运算符的功能有一些担忧。
举个例子:
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];
}
因此,实例每次都应该相同,因为"squares"数组在创建对象时分配一次。因此,感谢您的见解,我的问题一定在我的代码:)的其他地方
是的,因为有些广场是一个Square*
->
运算符就像一个(*varname).
.所以它是指针的内容,你得到的类型Square
.然后你可以用.
修改变量,因为它是一个结构体,所有变量都是公共的,不像在类中那样。
中返回的GetSquare
返回的对象与GetSquare
如下所示时可能出现的相同对象,则可以在函数 2 中看到您在函数 1 中所做的更改。
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 中的方形指针指向与函数 2 中的方形指针相同的平方,那么是的,您将看到函数 2 中函数 1 中设置的值(前提是按该顺序调用函数)。
如果指针指向不同的实例,您将看不到该值。
正如juanchopanza所指出的,这完全取决于您的GetSquare函数的作用。请发布该函数的定义。
它将在范围内,因为您没有使用任何形式的全局实例。我不知道getSquare实际上做了什么,但我假设它实例化了Square类并返回了实例......
访问someSquare->someID.index
就像访问someSquare->x
一样 - 在这两种情况下,它都会修改someSquare
指向的对象(在第一种情况下,它修改的是子对象)。
,如果 GetSquare(1) 返回相同的实例,那么更改也应该反映在 function2() 中。如果要确保返回的实例相同,请尝试通过以下语句打印指针 someSquare 的值:
printf("Value of pointer: %p n",someSquare);
如果此值相同,则表示它们是相同的实例,并且更改应反映在 function2() 中。
此外,GetSquare 应该是任何类之外的全局函数或静态函数。如果是实例函数,那么它将访问不同类对象的类"Square"的不同数组。
除此之外,我无法根据可用的代码给出其他意见。
- 混合组合和继承的C++问题
- 在混合代码库中将C转换为C++时出现许多包含错误
- <<操作员在下面的行中工作
- D3D11-将混合权重和索引传递到顶点着色器
- C++ 与操作员不匹配<<
- 操作员C++的模棱两可的过载
- C++中>>操作员过载时出现问题?
- NaN 上的宇宙飞船操作员
- C++分数混合比较运算符错误
- 是否可以混合使用SFINAE和模板专业化?
- 比根<操作员
- 如何在 Python C++ 混合库中调试非确定性分段错误?
- 使用 Boost.Spirit 解析具有混合数据类型的 OBJ 文件?
- SFINAE不能防止模棱两可的操作员过载吗?
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- C++11 中的混合列表初始化
- C++以迭代方式搜索混合类型地图
- #pragma(*诊断)当将Clang分析器与GCC编译器混合时
- 混合 Rcpp 模块和 Rcpp::export
- "."和"->"操作员的混合链