结构体
占内存大小:最大成数数据类型大小*成数数据个数。
定义和声明方式:
方式1:先定义结构体类型,然后声明一个该类型的变量
struct Student
{
char Name[20];
int Number;
int Age;
char Sex;
float Score;
};
struct Student Stu;//声明struct Student类型变量
方式2:定义结构体类型的同时,声明变量。如果是声明多个,用逗号分隔。
struct Student
{
char Name[20];
int Number;
int Age;
char Sex;
float Score;
}Stu;//声明struct Student类型变量 多个则此行代码为 }stu1,stu2;
方式3:在采用方式2的时候,可以把结构体类型名省略。如下:
struct
{
char Name[20];
int Number;
int Age;
char Sex;
float Score;
}Stu;//声明struct Student类型变量
方式4:用关键字typedef声明结构体变量。如下:
typedef struct
{
char Name[20];
int Number;
int Age;
char Sex;
float Score;
}Student;
Student Stu;//此时不再需要写成struct Stuent Stu:
初始化方式:
假设有一个如下的struct定义:
struct astruct
{
int a;
int b;
};
struct astruct test = {0};
即使astruct中都是基础类型的成员这样的初始化话也是不正确的。
这种初始化仅仅是把a变量设置为了0,而未对b变量做初始化。
产生这样错误的原因,大概是收到数组初始化的影响。数组是可以这么初始化话的,而且初始化的值只能是0!
对结构体的初始化,可以有一下四种。
struct test
{
int a;
int b;
};
int main()
{
struct test t1 = {0, 0};
struct test t2 = {
.a=2,
.b=3
};
struct test t3 = {
a:12345,
b:567890
};
struct test t4;
t4.a=4;
t4.b=5;
printf("t1.a = %d, t1.b = %d\n", t1.a, t1.b);
printf("t2.a = %d, t2.b = %d\n", t2.a, t2.b);
printf("t3.a = %d, t3.b = %d\n", t3.a, t3.b);
return 0;
}
第1种使我们最常见的方式,2,3中是gcc的扩展,非标准。
范例:#include<iostream>
using namespace std;
struct Stu{
char a;
int b;
};
int main()
{
struct Stu s1={'x',1};
struct Stu s2;
s2.a='x';
s2.b=2;
/*
struct Dtu s3={
.a='x',
.b=3
};
*/ //Dev c++不支持
struct Stu s4={
a:'x',
b:4
};
cout<<"s1 "<<s1.a<<" "<<s1.b<<endl;
cout<<"s2 "<<s2.a<<" "<<s2.b<<endl;
// cout<<"s3 "<<s3.a<<" "<<s3.b<<endl;
cout<<"s4 "<<s4.a<<" "<<s4.b<<endl;
system("pause");
}
![](https://img-my.csdn.net/uploads/201208/28/1346166050_1517.jpg)
成员引用方式:
方式1:
结构体变量名.成员名
方式2:
指针变量名->成员名
方式3:
(*指针变量名).成员名
结构体指针:
一般定义格式为: struct 结构体名 *结构体指针名
#include<iostream>
using namespace std;
struct Stu {
char name[20];
int number;
char Sex;
} *p;
int main()
{
struct Stu s1={"HK",18,'M'};
p=&s1;
cout<<p->name<<" "<<p->number<<" "<<p->Sex<<endl;
struct Stu *q;
q=&s1;
cout<<q->name<<" "<<q->number<<" "<<q->Sex<<endl;
system("pause");
}
![](https://img-my.csdn.net/uploads/201208/29/1346215281_5958.jpg)
联合
占内存大小:在联合中,各成员共享一段内存空间,一个联系变量的长度等于各成员中长度最长的长度。
声明:与struct的4种声明一样,只是关键字struct改成union。
初始化:对于每个union对象,只能对union成员中的一个进行初始化。其它成员则没有值。
#include<iostream>
using namespace std;
union Stu {
char name[20];
int number;
char Sex;
};
int main()
{
union Stu s1,*p;
// s1.name="HK";//incompatible types in assignment of `const char[3]' to `char[20]'
cin>>s1.name;
// cin>>s1.number;
// cin>>s1.Sex;
p=&s1;
cout<<s1.name<<" "<<s1.number<<" "<<s1.Sex<<endl;
cout<<p->name<<" "<<p->number<<" "<<p->Sex<<endl;
system("pause");
}
![](https://img-my.csdn.net/uploads/201208/29/1346215894_8123.jpg)
成员引用方式:同struct。
枚举
枚举类型实质上是整数集合。
#include<iostream>
using namespace std;
enum exam{you,liang,zhong,jige,bujige};
int main()
{
cout<<"size: "<<sizeof(exam)<<endl;
cout<<you<<'\t'<<liang<<'\t'<<zhong<<'\t'<<jige<<'\t'<<bujige<<endl;
system("pause");
}
运行结果为
size: 4
0 1 2 3 4占内存大小:根据不同编译器会有所不同,在devc++下是4,在其它编译器下也有可能是1。
声明与定义:
定义类型与声明变量:
方式1:
enum exam{you,liang,zhong,jige,bujige};//定义枚举类型
enum exam s1,s2;//声明枚举类型变量
方式2:
enum exam{you,liang,zhong,jige,bujige}s1,s2;
对于枚举型变量s1和s2到这里还只是进行了声明,声明后的初始值没有意义。
定义枚举型变量:
#include<iostream>
using namespace std;
enum exam{you=90,liang=80,zhong=70,jige=60,bujige=30};
int main()
{
enum exam s1,s2,*p,*q;
s1=you;//定义枚举类型变量
s2=zhong;//定义枚举类型变量
if(s1>=s2)
if(s1>s2)
cout<<"s1>s2"<<endl;
else
cout<<"s1=s2"<<endl;
else
cout<<"s1<s2"<<endl;
p=&s1;
q=&s2;
cout<<s1<<endl;
cout<<s2<<endl;
int sum=*p+*q;
cout<<sum<<endl;
system("pause");
}
![](https://img-my.csdn.net/uploads/201208/29/1346222011_9154.jpg)