例如假设struct
:
struct Point{
int x;
int y;
};
我宣布了一个指向这个结构的指针:
Point* p;
其中是p
,堆或堆栈的x和y?
并且课程是否相同?
答案 0 :(得分:4)
那个
x
和y
,堆或堆栈的地方是什么?{/ p>
无处。你还没有创建一个对象,只是一个可以指向一个对象的指针。
如果你在堆栈上创建一个自动对象,那就是它的位置:
p
如果你在堆上创建一个动态对象(官方称为免费商店),那就是它的位置:
Point point;
Point * p = &point;
课程是否相同?
是; Point * p = new Point; // Don't forget to delete it.
是一个类。
答案 1 :(得分:1)
问题的答案取决于p
指向的内容。如果它指向堆栈分配的结构,则p->x
和p->y
在堆栈中。如果它是使用new
(或malloc
)获得的,那么它们就在堆上。
与其他一些语言不同,C ++类和结构的布局没有区别。它们之间的区别仅在于默认访问限制:默认情况下,class
成员是私有的,而struct
成员是公开的。
答案 2 :(得分:1)
这取决于您初始化p
的方式。变量x
和y
在任何p
点都有:如果它在堆上,它们就在堆上;如果它在堆栈上,它们在堆栈上,如果p
指向静态变量,它们都不是。
忘记堆和堆栈:这些是编译器的实现细节。你感兴趣的不是位的位置,而是它们可能具有的寿命。
并且C ++实际上没有结构:无论使用哪个关键字(struct
,class
或union
),声明的是类类型。 (类类型可以分为两大类,联合类和非联合类类型。)