结构体定义
整型、长整数、字符型、浮点型这些数据类型只能记录单一的数据,而且这些数据类型只能被 称作基础的数据类型。如果要描述一个人的信息,就需要定义多个变量来记录这些信息,例如身高需要一个变量,体重需要一个变量,姓名需要一个变量,年龄需要一个变量,性别需要一个变量。如果可以将这些变量包含在一起则会大大减少程序代码的离散性,使程序代码阅读更加符合逻辑。而结构体则是实现这一功能的类型。结构体大小就是结构体成员大小之和
struct 结构体名 { 成员类型 成员名; 成员类型 成员名; }
说明:结构体和数组的区别:结构体由多个不同类型的数据组成的数据集合,而数组是相同元素的集合
结构体变量声明
第一种声明形式是在定义结构体后,使用结构体后,使用结构体类型名声明。
struct Per { int index; }; Per pPer;
第二种是定义结构体时直接声明。
struct Person{int index;} pInfo;
直接声明结构体变量是,可以声明多个变量。
int main(){ struct PersonInfo { int index; char name[30]; short age; } pInfo1,pInfo2; return 0; }
结构体成员及初始化
引用结构体成员的两种方式,一种是声明结构体变量后,通过成员运算符“ . ”引用;一种是声明结构体指针变量,使用指向“ : ”运算符引用
(1)使用“ . ”引用结构体成员,一般如下:
结构体变量名.成员名
struct PersonInfo { int index; char name[30]; short age; }pInfo; pInfo.index = 0; strcpy_s(pInfo.name,"小三"); pInfo.age = 20; cout<<pInfo.index<<endl;
说明:其中为字符串赋值的需要使用strcpy_s字符串复制函数
结构体可以在定义时直接对结构体变量赋值:
struct Person { int index; char name[30]; short age; }Info={0,"小三",20};
(2)在定义结构体时,可以同时声明结构体指针变量
struct PersonInfo { int index; char name[30]; short age; } *pPersonInfo; //访问成员数据 pPersonInfo->index;
例子:
struct Person { int index; char name[30]; short age; }*pPerson, Person = {0,"小三",30}; pPerson = &Person; cout << pPerson->age << endl; cout << pPerson->index << endl; cout << pPerson->name << endl;
结构体的嵌套
定义完结构体后就形成一个新的数据类型,C++语言在定义结构体时可以声明其他已经定义好的结构体变量,也可以在定义结构体时定义子结构体
(1)在定义时声明其他已经定义好的结构体变量:
struct PersonInfo { int index; char name[30]; struct WorkPlace { char Addrees[150]; cahr PostCode[30]; }; };
(2)在结构体中定义子结构体:
struct WorkPlace { char Addrees[150]; }; struct PersonInfo { int index; char name[30]; WorkPlace myWorkPlace; };
结构体的嵌套使用:
#include <iostream> using namespace std; int main() { struct PersonInfo { int index; char name[30]; short age; struct WorkPlace //嵌套的结构体 { char Address[150]; char PostCode[30]; char GateCode[50]; char Street[100]; char Area[50]; } WP; }; PersonInfo pInfo; strcpy_s(pInfo.WP.Address,"House"); //必须要用字符串拷贝 strcpy_s(pInfo.WP.PostCode,"100000"); strcpy_s(pInfo.WP.GateCode,"302"); strcpy_s(pInfo.WP.Street,"Lan Tian"); strcpy_s(pInfo.WP.Area,"china"); cout<<pInfo.WP.Address<<endl; return 0; }
结构体变量做函数的参数
#include <iostream> using namespace std; struct PersonInfo { int index; char name[30]; short age; }; void ShowStructMessage(struct PersonInfo MyInfo) { cout<<MyInfo.index<<endl; } int main() { PersonInfo pInfo; pInfo.index = 0; strcpy_s(pInfo.name,"小三"); pInfo.age = 20; ShowStructMessage(pInfo); return 0; }
结构体指针做函数参数
#include <iostream> using namespace std; struct PersonInfo { int index; char name[30]; short age; }; void ShowStructMessage(struct PersonInfo *pInfo) { cout<<pInfo->index<<endl; } int main() { PersonInfo Info; Info.index = 0; strcpy_s(Info.name,"小三"); Info.age = 30; ShowStructMessage(&Info); return 0; }
结构体数组
数组元素也可以是结构类型的元素,因此可以构成结构型数组。结构数组的每一个元素都是具有相同结构类型的下标结构变量。
定义结构数组变量如下:
struct PersonInfo { int index;} Person[5]; struct PersonInfo {int index;} pInfo; PersonInfo Person[5]; struct PersonInfo { int index; char name[30]; }Info[5] = {{0,"一"},{1,"二"},{2,"三"},{3,"四"},{4,"五"}};
说明:当对全部元素做初始化赋值时,可以不用给出数组长度
使用指针访问结构体数组
#include<iostream> using namespace std; int main() { struct PersonInfo{int index;char name[30];short age;}Person[5] = {{1,"一",20},{2,"二",21},{3,"三",22},{4,"四",23},{5,"五",24}}; struct PersonInfo *pPersonInfo; pPersonInfo = Person; //等同于把数组中的第一个元素的地址赋值给了指针pPersongInfo for(int i = 0;i<5;i++,pPersonInfo++) //pPersonInfo++就是地址向下一个元素移动 { cout<<pPersonInfo->index<<endl; } return 0; }