说我有这个简单的程序
#include <iostream>
using namespace std;
struct teststruct
{
int n;
long l;
string str;
};
int main()
{
teststruct wc;
wc.n = 1;
wc.l = 1.0;
wc.str = "hello world";
//cout << wc << endl; // what is wc by itself?
cout << &wc; // contains the memory address to the struct?
return 0;
}
我想了解wc中的内容?当我声明一个变量名为wc的结构类型时;什么是wc?它是指向内存地址的指针吗?我试图cout内容,但代码给了我一个错误。你能否澄清什么是wc
答案 0 :(得分:10)
什么是wc?它是指向内存地址的指针吗?
不,这是一个足够大的存储空间,可以包含teststruct
的所有成员。
在这种情况下,它具有自动存储,这意味着它与包含它的代码块一样长 - 在这种情况下,直到main()
结束。存储位置的详细信息是特定于实现的,但实际上它通常存储在线程堆栈的临时区域(堆栈帧),在函数开始时创建,并在函数退出时销毁
成员在该存储中的确切详细信息也是特定于实现的。
我试过cout内容,但代码给了我一个错误。
仅适用于<<
运算符重载的类型。标准库为所有基本类型和指针以及某些库类型(如std::string
)执行此操作;但是如果你想要支持你自己的类型,那么你需要提供自己的重载,例如:
std::ostream & operator<<(std::ostream & s, teststruct const & t) {
return s << t.n << ',' << t.l << ',' << t.str;
}
cout << wc << endl; // prints "1,1,hello world"
答案 1 :(得分:5)
wc
是具有自动存储的teststruct
类型的实例。其他每个细节都是特定于实现的,但在大多数情况下,实现使用堆栈作为自动存储区域。
&wc
是teststruct *
类型的表达式,会产生wc
的地址。
至于未提出的问题(你为什么不问它?):要输出结构的内容,你必须逐个输出它的成员:
cout << wc.n << ", " << wc.l << ", " << wc.str << endl;
然而,你的代码似乎存在误解; 1.0
是float
类型的文字,也就是它的浮点数。你确定它是你想要存储在long
变量中的吗?如果您想要long
字面值,请使用1L
。
答案 2 :(得分:0)
wc
是在堆栈上分配的teststruct
类型的对象
答案 3 :(得分:0)
将teststruct
的实例视为一个连续的内存区域,用于包含其成员变量的值。在打印时
cout << &wc;
您正在输出变量的地址,即存储它的内存中的位置。这是一个简单的答案,可能充满了详细的技术错误,但你问题的性质和措辞表明它可能会给你画一幅有用的图片。