我有以下数据结构:
struct Inner
{
int myValue;
};
struct Outer
{
Inner* inner;
};
Run Code Online (Sandbox Code Playgroud)
选项1
如果我执行以下操作:
Outer outer;
outer.inner = NULL;
outer.inner = new inner;
inner* pInner = outer.inner;
Run Code Online (Sandbox Code Playgroud)
然后为以下2个值添加监视:
那么它们都是非NULL,并且值相等.
选项2
如果我执行以下操作:
Outer outer;
outer.inner = NULL;
inner* pInner = outer.inner;
if (! pInner)
{
pInner = new inner;
}
Run Code Online (Sandbox Code Playgroud)
然后pInner指向有效的堆内存,而outer.inner仍为NULL.
问题
为什么选项不同 - 它们是否应该同时指向选项2中的相同内存?
假设我使用选项1,然后我从内部读取值.然后我可以互换使用pInner和outer.inner不能吗?为什么分配内存会有所不同?
指针存储存储器地址.在第一个选项中,存储由new innerin 分配的对象的内存位置outer.inner.然后将该值复制到,pInner并且两个变量都包含相同的地址.
在第二个选项中,首先outer.inner设置为包含地址NULL.复制此值pInner并且两个变量都包含NULL.之后pInner更改为包含新分配的对象的地址,但存储的地址outer.inner不受此影响.那个地址仍然是NULL.
指针只是恰好是内存地址的数字.不同的赋值与变量声明为相同int.这些数字实际上内存地址只有变得有趣时,*或->用于取消引用指针.两个不同的指针变量可能指向相同的地址,但它们仍然是不同的变量.