C++结构体数组访问

4

我正在学习Schildt的C++书籍,不太理解他在第三个结构下的意思; 有人能解释一下吗 ->

要访问结构数组中的特定结构,必须对结构名称进行索引。例如,要显示第三个结构的on_hand成员,您需要编写cout << invtry [2] .on_hand;

一些代码:

struct type{
 char item[40];
 double cost;
 double retail;
 int on_hand;
 int lead_time;
}invtry[SIZE];

11
我认为大多数人鄙视Schildt的书籍... - hbw
10
谷歌搜索 bullschildt (然后烧掉你的书)。 - fredoverflow
7
@learningtolive:立即为自己购买一本体面的C++书籍。Schildt的书的价值以瓦特衡量,相当于燃烧它产生的热量减去生产它所浪费的能量(这总是一个负值)。 - sbi
4
谈到学习C ++,你不能相信初学者对书籍的意见。从定义上讲,初学者不可能知道他们所学的是否符合C ++语言的习惯用法。初学者的积极评价可能意味着材料呈现得很好或其他方面,但这并不代表内容的质量。 - fredoverflow
5
你已经浪费了金钱,不要再犯错误,浪费时间 ;) - fredoverflow
显示剩余18条评论
3个回答

4
在结构体数组中,第三个结构体位于数组的第三个位置,即索引为2的位置。
在你(丑陋的)代码中,invtry被声明为类型为type的结构体数组(大小为SIZE)。因此,invtry[0]是第一个元素,invtry[1]是第二个元素,invtry[2]是第三个元素 - 当然,假设SIZE >= 3。
通常,你会这样写:
struct type{
 char item[40];
 double cost;
 double retail;
 int on_hand;
 int lead_time;
};

const int SIZE = 500;

type invtry[SIZE];

这与你所写的大致相同,除了当然SIZE的定义。但这会导致更少的混乱 - 在一部分中,您说一个结构体的type是什么 - 换句话说,您定义了type类型。稍后,您创建了一个名为invtrytype结构体数组。

像作者一样在同一行中执行此操作太糟糕了-在我看来。

现在您有一个包含500个结构体的数组。如果"type"是"Product",则将拥有表示500种产品的数组。每个产品都有其商品、成本、零售价等。

要访问数组中的第三个结构体,请写入invtry[2]。要访问其特定的on_hand字段,请写入invtry[2].on_hand。这与已定义类型的布局中on_hand的具体位置无关。

如果要获取第三个结构体的lead_time,请先访问第三个结构体,然后访问其lead_time成员:invtry[2].lead_time

当然,由于该类型没有默认(无参)构造函数,因此这500个产品未初始化-其中包含垃圾。但那是你的问题。


@learningtolive 不,这是无稽之谈。请阅读我回答的第二部分。 - Daniel Daranas
我该如何访问lead_time成员 - 通过哪个索引? inv[t].lead_time - highlevelcoder
你不能通过索引访问结构体成员。你首先要访问结构体,然后访问任何你想要的成员。我对我的答案进行了小修改,以包括这种情况。此外,我建议你选择一本关于C++基础知识的好书。几个StackOverflow问题推荐这类书籍。 - Daniel Daranas
结构体如何逻辑连接成员变量:例如,我想要item[1]的确切信息? - highlevelcoder
@learningtolive:那是一个实现细节。如果你想要item[1],只需要请求它:“char some_char = invtry[2].item[1];”。 - Daniel Daranas
显示剩余8条评论

1

尝试将“结构”替换为“数组项”。

因此,要访问invtry数组(它是一个结构体数组)中的第3个项目,您将使用invtry [2](索引从0开始,因此是2而不是3),然后是您想要读取的成员变量...

即invtry [2] .on_hand获取存储在'invtry'数组中第3个结构体的'on_hand'中的值


我猜楼主被C数组从0开始的事实所困惑,向您投票。不过我认为您的解释还有进一步改善的空间。 :-) - Omnifarious

0

你不应该尝试从Schildt的书中学习。它们存在严重缺陷。 其中很多信息已经过时或者完全错误。 代码以丑陋和糟糕的风格编写,其中有许多C-isms。 请参阅ACCU图书评论以获取更详细的书评。

尝试阅读Koenig和Moo的《Accelerated C++》或Stroustrup的《使用C++进行编程原理和实践》作为良好的初学者指南。


我自己不太清楚,但评论(再次由通常相当可靠的ACCU.org提供)也不是很好。此外,第二版真的很旧了(目前已经是第五版)。我推荐的书籍普遍受到高度评价,因为它们从一开始就用现代风格教你C ++,而不是像许多老书一样添加功能的C语言。 - Fabio Fracassi
@learningtolive Stroustrup有两本C++书籍,《程序设计与计算机科学基础》是一本面向初学者的新书,而《C++程序设计语言》则更像是一本参考书,不适合用于学习。 - Fabio Fracassi
@FredOverflow 确定你没有将它和 Stanly Lippman 的《C++ Primer》混淆吗?(据说也很好,但我还没读过。) - Fabio Fracassi
对于这个问题,有不同的意见。在我看来,同时学习C++和C并不是一个好主意。两种语言在语法上相似,但其方法和思维方式却截然不同,而在C中被视为良好风格的东西,在C++中则通常被视为非常糟糕的。 - Fabio Fracassi
1
@learning: Schildt建议先学习C语言?这是他无能的又一标志。C++的创造者说,将C作为学习C++的基础是一个严重错误 - fredoverflow
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接