一、定义结构
结构体特点:
1、结构是由不同数据类型的数据组成的集合体。
2、结构由数目固定的成员构成
3、 各成员可以具有不同的数据类型
4、一个结构变量在内存占有一片连续的存储空间
定义结构体需要先对结构体类型的组成进行描述,定义方法如下:
struct 结构体类型名称
{
数据类型 成员名1;
数据类型 成员名2;
数据类型 成员名3;
......
数据类型 成员名n;
};
结构体定义完成后,结构体类型名称在程序中的地位等同于整形(int),浮点型(double)这样的数据类型。
例如:
struct employee
{ char name [ 10 ] ;
double salary ;
char phone [ 20 ] ;
} ;
可以用不同的方法定义一个结构变量:
(1) 声明类型之后声明变量
struct employee
{
char name [ 10 ] ;
double salary ;
char phone [ 20 ] ;
} ;
int main()
{
employee worker1,worker2[101];
}
(2) 声明类型的同时声明变量
struct employee
{
char name [ 10 ] ;
double salary ;
char phone [ 20 ] ;
} worker1,worker2[101];
(3) 直接声明结构类型变量( 不常用)
struct
{ char name [ 10 ] ;
double salary ;
char phone [ 20 ] ;
} worker1,worker2[101];
二、访问结构
访问结构变量的成员
一般形式为:结构体变量名.成员名
例如:
employee worker1,worker2[101];
cin>>worker1.name;
cin>>worker2[1].salary>>worker2[1].phone;
或者
struct
{ char name [ 10 ] ;
double salary ;
char phone [ 20 ] ;
} worker1={ xiaoming, 5000, 400823823 };
用指针访问结构变量的成员
1、结构指针->成员
2、(*结构指针).成员
例:
# include <iostream>
using namespace std ;
# include <cstring>
struct person
{ char name[20] ;
unsigned long id;
double salary;
} ;
int main ( )
{ person pr1 ;
person * pp ; // 定义结构指针
pp = & pr1 ; // 取结构变量地址
strcpy ( pp -> name , “David Marat” ) ; // 对结构成员赋值
pp -> id = 987654321 ;
pp -> salary = 335.0 ;
cout << pp -> name << ‘\t’ << pp -> id << ‘\t’ << pp -> salary << endl ;
}
注意:对字符数组赋值时用strcpy与cin是不一样的,前者可以加上空格,而后者加上空格则会导致结果出现偏差。
类型相同的结构变量可以整体赋值
# include <iostream>
using namespace std ;
struct weather
{ double temp; double wind; } yesterday ;
int main ( )
{ weather today ;
yesterday . temp = 10.5 ;
yesterday . wind = 3.1 ;
today = yesterday ; // 结构变量整体赋值
cout << “Temp = ” << today . temp << endl ;
cout << “Wind = ” << today . wind << endl ;
}
这样yesterday这一结构变量内的值就赋给了today。
类型相同的结构变量是指同一标识符变量说明的变量
例如
struct weather1
{ double temp; double wind; } yesterday ;
struct weather2
{ double temp; double wind; } today ;
yesterday 和 today尽管成员相同,但不是同一类型的变量不可以整体赋值。
三、自引用结构
在结构体内部包含一个类型为该结构的成员这是非法的。
如:
struct node{
int a;
char name[101];
node p;//错的
}two;
其中p的存在是非法的,因为成员p又是另外一个完整的结构,而p的结构中又有成员p,这就有点像永远不会停止的递归,是非法的。但如果是结构体指针的话就是合法的。
struct node{
int a;
char name[101];
node *p;
}two;
为什么这是合法的呢?
因为其中指针的长度在被定义前就一定被编译器知道,而如果其中不是指针而是结构体那么编译器是不知道它的长度的,自然会报错。