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

结构体变量

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

结构体声明定义:

(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值