一、结构体
1、定义方式
使用关键词 struct
struct 自定义名
{
成员1类型 成员1;
…
};
如定义一个人的相关信息:
struct message
{
char name[20]; //定义姓名
char phone[11]; //定义电话号码
char *address; //定义地址
int age;//定义年龄
};
关于message的理解:可以将其看做一个自定义的类型,和int double等价看待。
既然message是一个类型,那么就可以定义变量(这里叫成员比较合适),在其他结构中就可以插入这种类型声明的成员。举个栗子:想在刚才的信息中插入这个人的性别,就可以这样干
struct sex1
{
char *sex;;
};
struct message
{
char name[20]; //定义姓名
char phone[11]; //定义电话号码
char *address; //定义地址
int age;//定义年龄
sex1 m ;//将定义的 sex(类型)结构插入进来
};
定义好结构部分后,就可以定义这种结构类型的变量了(有点绕?),有两种方式:
struct message
{
char name[20]; //定义姓名
char phone[11]; //定义电话号码
char *address; //定义地址
int age;//定义年龄
}worker1,worker2,*pp;
或者
struct message
{
char name[20]; //定义姓名
char phone[11]; //定义电话号码
char *address; //定义地址
int age;//定义年龄
};
message worker1,worker2,*p;
两种都是一样的效果,worker1就是message类型的变量,*p就是message类型的指针
在定义结构类型变量时,可以直接初始化,比如:
message worker1={“guankai”,17554420869,“henan_mianchi”,22}; 注意这个变量的初始化是有顺序的,与结构内的成员一一对应。
2、访问结构
对结构内定义的各个成员变量访问,可以实现赋值、读取。访问方式为:
结构变量名.成员
比如:message worker1; worker1.name; worker1.address; worker1.age;
举个栗子,实现对结构内成员赋值以及输出:
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <string.h>//strcpy()函数头文件
struct message
{
char phone[12];
char *name;
char *sex;
char *address;
};
void main()
{
/* message kays={"17354420769","guankai","man","he_nan"};定义方式1,直接初始化*/
message kays;
kays.name="guankai";
strcpy(kays.phone,"17354420769");//需要注意对于成员是数组类型,不能直接=,需要使用strcpy函数
kays.sex="man";
kays.address="he_nan";//定义方式2,对每个结构内成员进行赋值
cout<<kays.phone<<endl;
cout<<kays.name<<endl;
cout<<kays.sex<<endl;
cout<<kays.address<<endl;//逐个输出每个成员
}
输出结果:
这里需要注意的一点是,当结构内的成员类型为数组时,当是字符串时:如 char name[10];直接初始化是没有问题的,但是如果针对其进行赋值,必须采用strcpy()函数(如上述程序)。当是非字符串类型时,如:int a[3];那么进行赋值的时候,就需要采用:kays.a[0]=1; kays.a[1]=2; kays.a[2]=3;这样的形式来对每个元素单独赋值。
当定义的结构类型变量为数组时,要对每一个数组元素进行赋值,比如 message a[5],那么就需要对a[0]-a[5]分别赋值。举个栗子:
刚才讲的是直接访问结构,也可以通过指针来访问,访问形式为:
*(指针).成员 或者 指针->成员
如:
先作声明
struct message{…};
message kays;
message *pp=&kays;
那么
(*pp).name
或者
pp->name
举个栗子:
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <string.h>
struct message
{
char phone[12];
char *name;
char *sex;
char *address;
};
void main()
{
message kays;
message *pp;
pp=&kays;
strcpy((*pp).phone,"17354420769");
pp->name="guankai";
pp->sex="man";
pp->address="he_nan";
cout<<(*pp).name<<endl;
cout<<(*pp).phone<<endl;
cout<<pp->sex<<endl;
cout<<pp->address<<endl;
}
在这个程序中,使用了两种方式,是完全等效的,注意使用(*pp).name时,括号把 * 也包括在内。
输出结果为:
在这个实例中,pp为指针,且为结构类型的指针,对于pp++来说,偏移一个结构的长度。结构内的各个成员类型不同,所以不能使用传统指针偏移类型方式访问,只能使用成员方式访问。
结构类型相同的两个变量可以整体赋值,如message a; message b; 对a进行初始化后,可以b=a来进行整体赋值,关系可以与 int a=5,b; b=a;的关系来对比。
这就不举栗子了,比较简单。
二、共用体
1、共用体就是特殊的结构体,对于结构体来说,里边每个变量的地址是不一样的;对于共用体来说,里边每个变量共用一片地址空间。
2、关键字修饰 union
3、以程序为例,定义一个共用体,输入0,输出年级 5(int),输入1,输出 “学工部”;
#include <iostream>
using namespace std;
union parter //定义一个共用体
{
char department[10];
int grade;
};
void main()
{
int a;
cin>>a;
parter b;
if(a==0)
{
b.grade=3;
cout<<b.grade;
}
if (a==1)
{
strcpy(b.department,"jidian");
cout<<b.department;
}
}
需要注意的是,共用体内的各个变量共用一个地址空间,因此一次只能对一个变量进行赋值,输出一个变量。
三、结构体数组
一个数组中的元素类型为结构体类型,则叫做结构体数组,以一个程序为例:输入n个学生的信息并输出:
#include <iostream>
using namespace std;
struct student //定义一个结构体,名字为student
{
char name[20];
int age;
};
void main()
{
int n,i;
student *message; //定义一个结构体指针message
cout<<"INPUT THE AMOUNT OF STUDENT:";
cin>>n;//输入要录入的学生个数n
message=new student [n];//new student[n],系统动态分配n个student类型结构体的内存,返回的是地址;message为地址,这样指针就指向了动态分配的结构体数组地址
for(i=0;i<n;i++)
{
cout<<"name: ";
cin>>message[i].name;//结构体数组直接用message[i]的方式赋值、输出
cout<<"age: ";
cin>>message[i].age;
}
for(i=0;i<n;i++)
{
cout<<message[i].name<<" "<<message[i].age<<endl;
}
delete []message;
}
这里需要注意的是,对于常规结构体指针变量赋值,用的是message->name,对于结构体数组则不同,直接用message[i].name
四、共用体数组与之相似,不再列出。