2017.8.19结构体整理(对照类理解异同)

来源:互联网 发布:机器人单片机 编辑:程序博客网 时间:2024/06/16 05:58

结构体变量

结构体可以理解为类的一种特殊的类没有成员函数的类。

结构体声明定义:

(1)先声明结构体类型,再定义

student stu1,stu2;

(2)声明同时直接定义

struct Date{ int year;int month;int day;} date;

关于结构体字长:

如下例子:
定以后系统会自动分配内存给数据(类也是只给数据分配空间,不管函数)。
stu1,stu2在内存中各占63(int4+char[20]20+char1+int4+float4+char addr[30]30=63)个字节,但是采用sizeof计算长度时,结果为64。因为计算机是按照“字长”分配存储空间,字长为16的倍数

struct Student{ int num;//整型char name[20];//数组型char sex;//字符型int age;float score;char addr[30];}stu1,stu2;

结构体成员也可以是一个结构体变量。

#include <iostream>struct Date{int month;int day;int year;};struct Student{ int num;//整型char name[20];//数组型char sex;//字符型int age;Date birthday;char addr[30];}stu1,stu2;

结构体变量引用和初始化

(1)可以整体将结构体变量值赋给另外一个同型变量stu1=stu2;
(2)可以引用成员值。但是不能整体进行输入输出,不能cout<

cout<<&stu1;cout<<&stu1.age;struct Date{int month;int day;int year;}date1={511999};

结构体数组

数组各元素内存中连续存放。初始化:={{},{},……};

struct Student{ int num;//整型char name[20];//数组型char sex;//字符型int age;Date birthday;char addr[30];};Student stu[3];

例子

对候选人得票的统计:三个候选人,10个选民,要求:键盘输入选民所选的名字,然后输出三个候选人的得票结果。
结构体类性的三个人定义采取数组形式;仔细体会人员输入后的匹配比较程序;输出计数值的输出方法
(1)全局结构体数组Leader
(2)采用字符数组进行名字存储,用
if (strcmp(leader_name,leader[j].name)==0)字符串函数进行比较,而非==比较;
(3)下例采用字符串存储姓名,比较时用if (leader_name==leader[j].name)
采用字符串string更方便,更节省空间,程序易读。
分析:采用
struct Person
{char name[20];
int count;
};
则结构体数组中每个元素*占20+4=24个字节*;因为char leader[20]占20个字节
而采用`
struct Person
{string name;
int count;
};
结构体数组中每个元素占4+4=8个字节。因为string类型的成员只占4个字节。

#include <iostream>//新建项必须写明后缀.cpp   using namespace std;struct Person//声明结构体变量{char name[20];int count;};Person leader[3]={"Li",0,"Zhang",0,"Fun",0};//定义结构体变量并初始化int main(){int i,j;char leader_name[20];//外层循环控制输入的10张选票名字;内层循环判断并加1;for(i=0;i<10;i++ ){cin >> leader_name;//依次输入选票名字    for (j=0;j<3;j++)        if (strcmp(leader_name,leader[j].name)==0)    leader[j].count++;//需用字符串函数进行比较,而非==比较;}//进行三人的得票输出,纯数组操作for (j=0;j<3;j++){cout<<"候选人的名字:"<<leader[j].count<<endl;}}

改变:名字不用字符数组来存储,而用字符串存储;
需要添加#include string;比较直接用if(a**==**b)

#include <iostream>//新建项必须写明后缀.cpp   #include <string>//务必添加该文件,否则string定义的变量无效using namespace std;struct Person//声明结构体变量{string name;int count;};Person leader[3]={"Li",0,"Zhang",0,"Fun",0};//定义结构体变量并初始化int main(){int i,j;string leader_name;//外层循环控制输入的10张选票名字;内层循环判断并加1;for(i=0;i<10;i++ ){cin >> leader_name;//依次输入选票名字    for (j=0;j<3;j++)        if (leader_name==leader[j].name)   leader[j].count++;//需用字符串函数进行比较,而非==比较;}//进行三人的得票输出,纯数组操作for (j=0;j<3;j++){cout<<"候选人的名字:"<<leader[j].count<<endl;}}

链表

常见重要数据结构。利用结构体变量指针实现。
这里写图片描述

声明一个结构体类型,包含:实际数据+下一节点地址的指针变量

struct Student{int num;float score;Student *next;//定义一个指向Student结构体变量的指针next};

建立和输出简单列表

这是个简单链表,程序中已定义,不是临时开辟文件,也不能用完后释放,称之为静态链表
动态链表则是指:可以随时插入和删除,采用后续的动态分配内存的运算符new动态撤销内存的运算符delete

#define NULL 0#include <iostream>using namespace std;//不能少,否则会出现未定义标识文件的错误。struct Stu{long num;float score;struct Stu *next;//定义一个指向Student结构体变量的指针next};Stu a,b,c,*head,*p;int main (){a.num=31001;a.score=89.5;b.num=31003;b.score=90;c.num=31005;c.score=85;//对节点成员赋值head=&a;//将节点起始a地址赋给头指针head 结构体变量虽然不能整体引用,但可以整体名字作为地址来用,&是取地址操作a.next=&b;b.next=&c;c.next=NULL;p=head;//使得p指针指向a节点//依次输出成员值do{cout<<p->num<<" "<<p->score<<endl;p=p->next;}while(p!=NULL);return 0;}

结构体类性数据作函数参数

(1)结构体变量名做参数:形参需为同类型变量,函数调用时开销很大,形参和实参分别占用不同单元;不建议用。
(2)用指向结构体变量的指针实参,将结构体变量地址传给形参
(3)用结构体体变量的引用变量做函数参数。
(2) (3)中的形参不单独占用单元,指向同一个内存单元;

#include <iostream>#include <string>using namespace std;//不能少,否则会出现未定义标识文件的错误。struct Stu{int num;string name;float score[3];}stu1={12345,"Lili",67.5,89,78.5};int main(){void print (Stu &);///////(3)函数声明 实参为Stu类型变量的引用;print (stu1);//千万别输错了符号()return 0;}void print (Stu &stud)/////////函数定义,形参为结构体变量的引用{....}
int main(){void print (Stu *);///////函数声明 形参为指向Stu类型变量的指针;//定义基类型为Stu的指针变量pt;Stu *pt=&stu;print (stu1);//千万别输错了符号()return 0;}
原创粉丝点击