struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;
type_name
是结构类型的名称,object_name
可以是一组该结构类型的对象的有效标识符。在花括号 {}
内,是数据成员的列表,每个成员都用一个类型和一个有效的标识符作为其名称来指定。
|
|
product
的结构类型,并定义它有两个成员:weight
和 price
,每个成员都有不同的基本类型。这个声明创建了一个新的类型(product
),然后用它来声明该类型的三个对象(变量):apple
、banana
和 melon
。请注意,一旦 product
被声明,它的使用方式就和任何其他类型一样。struct
定义的末尾,分号(;
)之前,可以使用可选字段 object_names
来直接声明该结构类型的对象。例如,结构对象 apple
、banana
和 melon
可以在定义数据结构类型时就进行声明:
|
|
object_names
,类型名称(product
)就变成了可选的:struct
语句要么需要一个 type_name
,要么在 object_names
中至少有一个名称,但不一定两者都需要。product
)和该类型的对象(apple
、banana
和 melon
)。从一个结构类型(product
)可以声明出许多对象(例如 apple
、banana
和 melon
)。apple
、banana
和 melon
),就可以直接访问它们的成员。语法很简单,在对象名和成员名之间插入一个点(.
)。例如,我们可以像操作它们各自类型的标准变量一样来操作这些元素:
|
|
apple.weight
、banana.weight
和 melon.weight
的类型是 int
,而 apple.price
、banana.price
和 melon.price
的类型是 double
。
|
|
Enter title: Alien Enter year: 1979 My favorite movie is: 2001 A Space Odyssey (1968) And yours is: Alien (1979) |
yours.year
是一个 int
类型的有效变量,而 mine.title
是一个 string
类型的有效变量。mine
和 yours
本身也是有类型的变量(movies_t
类型)。例如,它们都被传递给了 printmovie
函数,就像它们是简单变量一样。因此,数据结构的一个特性就是能够既可以单独引用其成员,也可以引用整个结构。在这两种情况下,都使用相同的标识符:结构体的名称。
|
|
Enter title: Blade Runner Enter year: 1982 Enter title: The Matrix Enter year: 1999 Enter title: Taxi Driver Enter year: 1976 You have entered these movies: Blade Runner (1982) The Matrix (1999) Taxi Driver (1976) |
|
|
amovie
是一个 movies_t
结构类型的对象,而 pmovie
是一个指向 movies_t
结构类型对象的指针。因此,下面的代码也是有效的:
|
|
pmovie
的值将被赋为对象 amovie
的地址。->
)。
|
|
Enter title: Invasion of the body snatchers Enter year: 1978 You have entered: Invasion of the body snatchers (1978) |
->
)是一个解引用运算符,专门用于指向含有成员的对象的指针。这个运算符用于直接从对象的地址访问其成员。例如,在上面的例子中:
|
|
|
|
pmovie->title
和 (*pmovie).title
这两个表达式都是有效的,都访问了由名为 pmovie
的指针所指向的数据结构的成员 title
。这与下面的表达式完全不同:
|
|
|
|
pmovie
中一个假设存在的名为 title
的指针成员所指向的值(但实际情况并非如此,因为 title
不是指针类型)。下表总结了指针运算符和结构成员运算符的可能组合:表达式 | 求值内容 | 等价于 |
---|---|---|
a.b | 对象 a 的成员 b | |
a->b | 由 a 指向的对象的成员 b | (*a).b |
*a.b | 对象 a 的成员 b 所指向的值 | *(a.b) |
|
|
|
|
![]() 动态内存 | ![]() 目录 | ![]() 其他数据类型 |