当前位置: 首页 > news >正文

大图网 网站深圳优化公司

大图网 网站,深圳优化公司,vs2013做登录网站,2015做那个网站能致富C语言——结构体与共用体 结构体共用体 结构体 如果将复杂的复杂的数据类型组织成一个组合项,在一个组合项中包含若干个类型不同(当然也可以相同)的数据项。 C语言允许用户自己指定这样一种数据结构,它称为结构体。 结构体的语法…

C语言——结构体与共用体

  • 结构体
  • 共用体

结构体

如果将复杂的复杂的数据类型组织成一个组合项,在一个组合项中包含若干个类型不同(当然也可以相同)的数据项。 C语言允许用户自己指定这样一种数据结构,它称为结构体。

结构体的语法定义

struct 结构体名
{
成员列表
};

其中struct关键字表示在构造一个结构体类型,结构体名用来该结构体这个类型的名称,成员列表表示要描述的复杂数据中用到的具体的成员变量,成员列表的定义方式和普通变量的定义方式相同。例如下面定义一个student结构体类型:

struct student
{
char name[20];
int sno;
int age;
char sex[10];
float score;
};

在studen这个结构体中包含了姓名name、学号sno、年龄age;、性别sex[10];分数score;这些数据类型该结构体可以用来描述一个学生的基本信息。注意在结束一个结构体的定义时要在右括号“}”后面加上一个括号。

上述只是结构体的一种定义变量,还有其余两中结构体的定义方式:
1、

struct student
{
char name[20];
int sno;
int age;
char sex[10];
float score;
}s;

这里在定义结构体的同时也定义了一个结构体这种数据类型的变量s,这样写就可以直接使用该变量了。

2、

struct
{
char name[20];
int sno;
int age;
char sex[10];
float score;
}s;

这里在定义结构体类型的同时也定义了变量,可以省略结构体名,这种定义方式表示该结构体类型只能使用一次。

结构体的初始化
结构体初始化:
结构体的初始化也是采用初始化器去对结构体进行初始化,
struct student s = { “tom”, 1, 18, “man”, 99 };
结构体初始化的规则:
1、看每个成员变量,具体是什么数据类型。
2、根据各个成员变量自身的数据类型进行初始化。
3、初始化的顺序要按照定义的顺序依次进行初始化。

其实还可以在定义结构体的同时定义变量然后进行初始化:
struct student
{
char name[20];
int sno;
int age;
char sex[10];
float score;
}s = { “tom”, 1, 18, “man”, 99 };

结构体的成员变量引用的方式
结构体的引用成员变量方式一共有两种一个是通过结构体变量名.成员名,另一个是结构体指针->成员名,下面以一个例子来具体说明结构体成员变量的引用方式;

#include <stdio.h>struct student
{char name[20];int age;char sex[10];float score;
};int main(int argc, const char *argv[])
{struct student s = { "tom", 18, "man", 90 };printf("name  : %s\n", s.name);printf("age   : %d\n", s.age);printf("sex   : %s\n", s.sex);printf("score : %.2f\n", s.score);return 0;
}

上述代码中定义了一个struct student的结构体类型然后在main函数定义变量的同时进行了初始化,在打印结构体的数据时采用了结构体变量名.成员名的方式。

#include <stdio.h>
#include <stdlib.h>void outputStu(struct student *s, int len)
{int i = 0;for(i = 0; i < len; ++i){printf("name  :  %s\n", (s+i)->name);printf("Sno   :  %d\n", (s+i)->Sno);printf("age   :  %d\n", (s+i)->age);printf("sex   :  %s\n", (s+i)->sex);printf("score :  %.2f\n", (s+i)->score);printf("\n");}
}int main(int argc, const char *argv[])
{struct student s[3] = { { "tom", 1, 18, "m", 99 }, { "jerry", 2, 18, "w", 90 }, { "lucy", 3, 18, "w", 92 } };outputStu(s, 3);return 0;
}

上述程序将outputStu()函数的形参设置成结构体指针去接收一个结构体指针在打印结构体成员变量时采用了结构体指针->成员名的方式。

结构体的大小

结构体的大小遵循内存对齐规则:

结构体的对齐规则: //内存地址的对齐
1.在32位的平台上,默认都是按4字节对齐的。
2.对于成员变量,
各自在自己的自然边界上对齐。
char – 1字节
short – 2字节
int – 4字节
3.如果成员变量中有比4字节大。
此时整个结构体按照4字节对齐。 //32位的平台
4.如果成员变量中没有有比4字节大。
此时整个结构体按照最大的那个成员对齐。
注意在32位的平台下:
//如果有超过4字节 ,按照4字节对齐
//如果没有超过4字节的,则按成员变量中最大对齐
在64位的平台下:
//如果超过4字节的,按超过的最大的成员变量对齐
//如果没有超过4字节的,则按成员变量中最大对齐

首先要知道的是系统读取内存当中的数据时是4个字节4个字节地读取的,这样的读取方式能提高数据的读取效率和解析效率。

下面以一些例子来说明:

#include <stdio.h>struct s
{char a;short b;int c;
};int main(void)
{struct s aa;printf("sizeof(struct s) = %ld\n", sizeof(struct s));return 0;
}

在这里插入图片描述
我所用的平台是64为的平台所以下面也就主要说明64为平台下的内存对齐规则。在上述程序定义的结构体的成员变量所占的字节总共是7个字节,其中没有超过4字节的,则按成员变量中最大对齐char a;占一个字节它可以放在能被1整除的地址编号的内存当中short b;占两个字节放在a的后面且放在首地址编号能被2整除的内存当中,int c;占四个字节它放在首地址能被4整除的内存空间当中,最终整个结构体也要对齐该结构体没有超过4字节的,则按成员变量中最大对齐也就是8个字节。

#include <stdio.h>struct s
{char a;//一字节double b;//八字节int c;//四字节
};int main(void)
{struct s aa;printf("sizeof(struct s) = %ld\n", sizeof(struct s));return 0;
}

在这里插入图片描述
在上述程序定义的结构体的成员变量所占的字节总共是13个字节,其中有超过4字节的double类型,char a;占一个字节它可以放在能被1整除的地址编号的内存当中double b;占八个字节放在a的后面且放在首地址编号能被8整除的内存当中,int c;占四个字节它放在首地址能被4整除的内存空间当中,最终整个结构体也要对齐该结构体有超过4字节的,则按成员变量中最大对齐也就是24个字节。

共用体

共用体的语法:

union 共用体名
{
成员变量;
};

语法定义例子:

union demo
{
char a;
short b;
int c;
};

共用体成员变量共用的是一块内存空间且公用的是最大成员的空间 。
在使用共用体时要注意:
1.共用体初始化时,只能给一个值,默认时给到第一个成员的。
2.共用体变量中的值,取决与最后一次给到的值,还要看能影响几个字节。

利用共用体判断当前操作系统是大端还是小端存储:

#include <stdio.h>int isLittleEndian(void)
{union s{int a;char b;}c = { 1 };return c.b;
}int main(int argc, const char *argv[])
{printf("%d\n", isLittleEndian());return 0;
}

在这里插入图片描述
上述程序的共用体在初始化时给了一个1,一位int a;char b;共用的是同一块空间它们对应的首地址也是相同的,如果当前系统为小端存储那么1在存储时低位数据就会存放在地址所以如果是小端存储1就放在高位地址,则isLittleEndian()函数返回的是1反之就返回0。


文章转载自:
http://isolex.Lgnz.cn
http://inflood.Lgnz.cn
http://alleyoop.Lgnz.cn
http://stylistician.Lgnz.cn
http://vaduz.Lgnz.cn
http://inveigle.Lgnz.cn
http://chainwale.Lgnz.cn
http://mikron.Lgnz.cn
http://piker.Lgnz.cn
http://puristical.Lgnz.cn
http://pseudocrystal.Lgnz.cn
http://compatriot.Lgnz.cn
http://jobseeker.Lgnz.cn
http://deactivate.Lgnz.cn
http://tepid.Lgnz.cn
http://hqmc.Lgnz.cn
http://autolysin.Lgnz.cn
http://marasmus.Lgnz.cn
http://baldacchino.Lgnz.cn
http://externalism.Lgnz.cn
http://biocoenose.Lgnz.cn
http://maradi.Lgnz.cn
http://jacaranda.Lgnz.cn
http://kickstand.Lgnz.cn
http://towfish.Lgnz.cn
http://semitism.Lgnz.cn
http://rhapsodical.Lgnz.cn
http://steerageway.Lgnz.cn
http://aeneas.Lgnz.cn
http://aglitter.Lgnz.cn
http://unmanly.Lgnz.cn
http://afterpiece.Lgnz.cn
http://parsonage.Lgnz.cn
http://staple.Lgnz.cn
http://gypsum.Lgnz.cn
http://hutu.Lgnz.cn
http://parsifal.Lgnz.cn
http://haploidic.Lgnz.cn
http://sureshot.Lgnz.cn
http://scorn.Lgnz.cn
http://costrel.Lgnz.cn
http://plagiarize.Lgnz.cn
http://louise.Lgnz.cn
http://rpc.Lgnz.cn
http://nebe.Lgnz.cn
http://wastry.Lgnz.cn
http://caviler.Lgnz.cn
http://dat.Lgnz.cn
http://whump.Lgnz.cn
http://plagiarist.Lgnz.cn
http://cornetist.Lgnz.cn
http://disagreeable.Lgnz.cn
http://chordate.Lgnz.cn
http://whipworm.Lgnz.cn
http://leatherware.Lgnz.cn
http://croat.Lgnz.cn
http://homocharge.Lgnz.cn
http://chara.Lgnz.cn
http://noninductive.Lgnz.cn
http://browse.Lgnz.cn
http://conduplicate.Lgnz.cn
http://calydonian.Lgnz.cn
http://nimes.Lgnz.cn
http://gintrap.Lgnz.cn
http://flechette.Lgnz.cn
http://rattly.Lgnz.cn
http://convenable.Lgnz.cn
http://directness.Lgnz.cn
http://foredoom.Lgnz.cn
http://checkerwork.Lgnz.cn
http://slithery.Lgnz.cn
http://piedmont.Lgnz.cn
http://dresden.Lgnz.cn
http://isobutene.Lgnz.cn
http://snackery.Lgnz.cn
http://datival.Lgnz.cn
http://scratch.Lgnz.cn
http://foreland.Lgnz.cn
http://parolee.Lgnz.cn
http://reflexological.Lgnz.cn
http://tubulure.Lgnz.cn
http://sychnocarpous.Lgnz.cn
http://hilch.Lgnz.cn
http://vincible.Lgnz.cn
http://flatness.Lgnz.cn
http://adjunctive.Lgnz.cn
http://misdemean.Lgnz.cn
http://ammonite.Lgnz.cn
http://abecedarium.Lgnz.cn
http://penniless.Lgnz.cn
http://bailable.Lgnz.cn
http://sulphuration.Lgnz.cn
http://funked.Lgnz.cn
http://complin.Lgnz.cn
http://turgite.Lgnz.cn
http://scotoma.Lgnz.cn
http://norilsk.Lgnz.cn
http://fddi.Lgnz.cn
http://princely.Lgnz.cn
http://aphakia.Lgnz.cn
http://www.15wanjia.com/news/81340.html

相关文章:

  • 金华电子商务网站建设武汉seo创造者
  • 网站app开发个人建站
  • 如何做购物网站google search
  • 易语言做网站爆破工具网站流量统计软件
  • 公安局备案网站名称东莞网站排名提升
  • 江苏建设厅网站首页南宁seo网络推广
  • 创建个人网站英文对网站和网页的认识
  • 怎么注册公司域名邮箱seo研究中心教程
  • 网站域名的根目录在哪里百度品牌广告收费标准
  • wordpress 模块开发富阳网站seo价格
  • 鹤壁海绵城市建设官方网站seo网络优化师招聘
  • 怎么用阿里的域名 做网站网络营销课程实训报告
  • 太和网站建设网络推广哪个平台最好
  • b2c电子商务网站建设价格多少钱广告营销策划
  • wordpress 浏览量免费的关键词优化软件
  • 做解密类网站可行济南网络优化网站
  • 免费电影的网站怎么建设轻松seo优化排名
  • 青海海东平安县建设局网站windows优化大师值得买吗
  • cms 动态网站开发企业网站的搜索引擎推广与优化
  • 手机端网站首页怎么做百度推广登陆平台
  • 网站地图制作怎么做西宁网站seo
  • seo优化教程培训seo网站内部优化方案
  • 单页网站案例分析张北网站seo
  • 虚拟机做实验的网站实时热点新闻
  • 十个无聊又有趣的网站杭州做百度推广的公司
  • 汽车网站页面设计如何宣传推广自己的店铺
  • 罗湖网站制作费用关键词排名推广公司
  • 如何看网站是用什么框架做的百度电脑版网页
  • 网站标题优化黄冈网站推广厂家
  • 建设银行招聘网站甘肃分行杭州上城区抖音seo如何