第十章-创新互联

一、结构体类型的定义及初始化

将不同类型变量封装在一起。(本质是一种数据类型)

创新互联公司自成立以来,一直致力于为企业提供从网站策划、网站设计、网站制作、成都做网站、电子商务、网站推广、网站优化到为企业提供个性化软件开发等基于互联网的全面整合营销服务。公司拥有丰富的网站建设和互联网应用系统开发管理经验、成熟的应用系统解决方案、优秀的网站开发工程师团队及专业的网站设计师团队。

方法一:

先定义结构体类型,再定义结构体变量

struct Student(结构体类型名)  //定义结构体类型

{

int num;

int name[20];

//成员列表

};

Student lucy={20,"lucy"};  //定义结构体类型的变量  +初始化

lucy.name="bob";//错误,name是字符数组变量名,不带这样赋值的

改为:strcpy(lucy.name,"bob");

方法二:

定义类型的同时定义结构体变量

#include //memset的头文件

struct Student(结构体类型名)

{

int num;

int name[20];

//成员列表

}lucy;

Student bob;

memset(&bob,0,sizeof(bob));  //初始化为零,清空结构体 

补充:void *memset(void *dst,void *val,void *size) :

将地址从dst开始,长度为size的所有字节赋值为 val

方法三:

定义一次性结构体类型

struct              //无结构体类型名,无法在外定义结构体类型变量

{

int num;

int name[20];

//成员列表

}lucy;

*注意:

  • 定义结构体类型时,系统不会为结构体类型开辟空间,当定义结构体类型的变量时才开辟空间。结构体中的成员具有独立的空间
  • 不要给成员初始化值
二、相同类型的结构体变量之间的赋值方法

Student lucy={100,"lucy"};

Student bob;

方法一:逐个成员赋值

bob.num=lucy.num;

strcpy(lucy.name,bob.name);

方法二:直接赋值(推荐)

bob=lucy;

方法三:内存拷贝

memcpy(&bob,&lucy,sizeof(Student));

三、结构体嵌套结构体 

struct Ob

{

int year;

int month;

int day;

};

struct Student

{

int num;

int name[20];

int Ob;

}lucy;

cout<

四、结构体数组

本质是数组 ,存的是结构体变量

Student arr[2]={{100,"lucy"},{20,"bob"}};

cout< 五、结构体指针变量

本质是变量,存的是结构体变量的地址

Student lucy={100,"lucy"};

Student *p=&lucy;

cout<< p->num<

cout<< (&lucy)->num<

结构体用 . 访问成员,地址可以用->访问成员

六、结构体数组元素的指针变量

本质是指针变量,保存结构体数组元素的地址

Student arr[2];

cout

cout<<(arr+1)->num;

七、结构体指针成员 1.结构体变量在堆区,结构体指针成员指向文字常量区 

struct Stu

{
int num;

char *name;

}

Stu jack={20,"hello"};  //jack.name只保存了“hello”的首地址,指向文字常量区,"hello"存在文字常量区内

若要jack.name指向堆区

#include

jack.name=new char[20];

strcpy(jack.name,"hello");

delete [] lucy.name;

2.结构体变量在堆区,结构体的指针成员也指向堆区

struct Stu

{
int num;

char *name;

}

Stu *p=new Stu;

p->name=new char[20];

p->num=100;

strcpy(p->name,"hello");

delete [] p->name;   //先释放成员指向

delete p;                  //再释放结构体变量

八、结构体拷贝   1、结构体浅拷贝

将结构体变量空间内容  复制一份到  另一个相同类型的结构体变量空间中

*注意:如果结构体中有指针成员,则会带来多次释放堆区空间的问题

lucy.name 和 bob.name都指向同一堆区空间,释放 lucy.name 后又释放 bob.name 就会造成堆区空间重复释放。

Student lucy={100,"lucy"};

Student bob;

bob=lucy;

2、结构体深拷贝 

给结构体指针成员单独开辟空间 

n) Student lucy={100,"lucy"};

Student bob;

bob.num=lucy.num;

bob.name=new char[20];

strcpy(bob.name,lucy.name);

九、结构体对其规则  

以空间换时间

1.确定分配单位 (一行分配多少个字节)

结构体中大的基本类型长度决定

如果用#pragma pack(n)强制对齐,则分配单位为 min(大的基本类型长度,n)

2.确定成员偏移量

成员偏移量=成员自身类型的整数倍

3.收尾工作

结构体的总大小=分配单位的整数倍

十、结构体的位域

以 位 为单位的成员,叫位段/位域 

用于节约空间、位操作、嵌入式等

struct packed_data

{

unsigned int a:2;

unsigned int b:6;

}data;

  • a的类型是 unsigned int ,占 两位 二进制位
  • 没有非位域隔开的位域,叫相邻位域;相同类型的相邻位域可以压缩,但压缩位数不能超过自身类型大小

(本身a、b、c各占一个字节,共3字节,但相邻位域可压缩,合在一起共8位刚好1字节)

  • 不要对位域取地址

  • 对位域赋值,不要超过位域本身位的宽度

  • 另起一个存储单元

  • 无意义位段(重要)

(定义了两个没有赋予意义的位段,并不是不合法) 

案例:

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前标题:第十章-创新互联
本文地址:http://pwwzsj.com/article/djidoj.html