C语言结构struct用法详解,新手必看
结构(struct)各种变量进行组合这些变量是由基本数据类型构成的并且用一个标识符来命名这种组合就是结构。结构中可以使用不同的数据类型。1. 结构说明和结构变量定义在Turbo C里结构属于一种数据类型能够运用结构变量所以如同其他。类型的变量一样, 在使用结构变量时要先对其定义。定义结构变量的一般格式为:struct 结构名类型 变量名;类型 变量名;...} 结构变量;结构名是结构的标识符不是变量名。种类是第二节里所讲的那五种数据种类分别是整数类型带小数点的数值类型单个字符的类型指向内存地址的类型以及。无值型)。称作结构成员的是构成结构的每一个类型变量它如同数组的元素那般。然而数组之中。元素是以下标来访问的, 而结构是按变量名字来访问成员的。下面举一个例子来说明怎样定义结构变量。struct stringchar name;int age;char sex;char depart;有五个变量分别是wage1wage2wage3wage4wage5它们的数据类型是float。} person;这一个例子定义了一个结构其结构名为string该结构有一个变量person要是省略变量名。person就转变为对结构的阐述。使用已阐述的结构名同样能够定义结构变量。如此这般来定义。时上例变成:struct stringchar name;int age;char sex;char depart;开辟出用于存放工资的空间分别命名为工资一工资二工资三工资四。 wage5;};struct string person;倘若是要去定义好多有着相同形式的结构变量之时运用这种办法会较为便利它首先进行。结构说明, 再用结构名来定义变量。例如:定义结构体类型为字符串其中包含名为Tianyr的成员还有名为Liuqi的成员以及其他省略的成员。要是把结构名给略去那就称作无名结构这般情形经常在函数里头出现用到这。种结构时前面的例子变成:structchar name;int age;char sex;char depart;float wage1, wage2, wage3, wage4, wage5;} Tianyr, Liuqi;2. 结构变量的使用结构属于一种新的数据类型所以呀结构变量能够如同其它类型的变量那般进行赋值。运算, 不同的是结构变量以成员作为基本变量。结构成员的表示方式为:结构变量.成员名倘若把 “结构变量.成员名” 视作一个完整的整体那么这一个整体所具备的数据类型跟结构当中。该成员的数据类型相同, 这样就可象前面所讲的变量那样使用。下面这个例子定义了一个结构变量该变量的每个成员都要从键盘接收数据之后。在结构里针对浮点数展开求和操作之后把运算得出的结果进行显示与此同时将那些数据以文本的形式存进一个有着特定名称的里面。磁盘文件wage.dat里。留意此例子中各式各样结构成员的访问情况。例3:i ncludemain()构想一种结构体此结构体用于定义一个结构变量通过特定方式来进行界定。char name;int age;char sex;char depart;float wage1, wage2, wage3, wage4,wage5;}a;FILE *fp;float wage;char c’Y’;fpfopen(wage.dat, w);/*创建一个文件只写*/while(c’Y’||c’y’)/*判断是否继续循环*/printf(/nName:);使用scanf函数以格式化的方式按照指定的格式说明符输入一个字符串存入a.name中以此来完成输入姓名这一操作。printf(Age:);通过scanf函数以“%d”的格式将数据输入到a.wage所指向的存储单元中以此来实现输入年龄这一操作。printf(Sex:);scanf(%d, a.sex);printf(Dept:);scanf(%s, a.depart);printf(Wage1:);通过scanf函数以%f的格式取地址且针对变量a结构体内有wage1成员的情况进行输入工资的操作。printf(Wage2:);scanf(%f, a.wage2);printf(Wage3:);scanf(%f, a.wage3);printf(Wage4:);scanf(%f, a.wage4);printf(Wage5:);scanf(%f, a.wage5);工资等于a乘以工资1加上a乘以工资2加上a乘以工资3加上a乘以工资4加上a乘以工资5。printf(The sum of wage is%6.2f/n, wage);/*显示结果*/fprintf(fp,按格式“s%4d%4s%30s.2f/n”进行结果写入文件操作。a.name, a.age, a.sex,a.depart, wage);while(1)printf(Continue?);cgetche();假如字符c等于大写字母Y或者字符c等于小写字母y这个形式又或者字符c等于大写字母N再或者字符c等于小写字母n 那么。break;fclose(fp);3. 结构数组和结构指针结构是一种新的数据类型, 同样可以有结构数组和结构指针。一、结构数组结构数组乃拥有相同结构类型之变量集合倘若要去给一个班级定义40个同学。能够被定义成一个结构数组的、是姓名、性别、年龄以及住址如下这般显示struct{char name;char sex;int age;char addr;}student;也可定义为:struct string{char name;char sex;int age;char addr;};struct string student;要明确指出的是结构数组成员的访问是以数组元素作为结构变量的其呈现形式为。结构数组元素.成员名例如:student.namestudent.age事实上结构数组等同于一个二维构建第一维是结构数组的元素而每一个元素是。一个结构变量, 第二维是结构成员。注意:结构数组的成员也可以是数组变量。例如:struct aint m;float f;char s;}y;为了访问结构a中结构变量y的这个变量, 可写成y.m二、结构指针结构指针是那种指向结构的指针其通过一个加在结构变量名之前的“*”操作符来予以确定。义, 例如用前面已说明的结构定义一个结构指针如下:struct string{char name;char sex;int age;char addr;}*student;也能够省略掉结构指针名仅仅作出结构说明之后再借着下面的语句去定义结构指针。struct string *student;使用结构指针去对结构成员进行访问和结构变量针对结构成员的访问在表达方式上 是不一样的。上有所不同。结构指针对结构成员的访问表示为:结构指针名-结构成员当中“-”乃是两个符号“-”以及“”的组合仿若有一个箭头朝着结构成员指向。比如说要。给上面定义的结构中name和age赋值, 可以用下面语句:把“Lu G.C”复制到student所指向结构体的name成员中。student-age18;事实上student 指向的 name它其实就是对 (*student) 所指向的 name 的一种缩写表现形式。要明确的是结构指针乃是指向结构的一种指针也就是结构里首个成员的起始地址。址所以于使用之前得对结构指针开展初始化操作也就是去分配整个结构长度所对应的字节空间。这可用下面函数完成, 仍以上例来说明如下:学生呢为结构体字符串指针类型动态分配内存其分配的数量是大小数量为。(struct string));结构为string的结构体的字节长度由(size of (struct string))自动进行求取的动作。malloc() 函数确定了一个内存区域这一内存区域的规模是结构的长度之后把该区域的诈地址当作结构指针递回。注意:1. 作为一种数据类型的结构所以定义相同有局的结构变量或者结构指针变量。部变量和全程变量, 视定义的位置而定。2. 结构变量名并非是指向那个结构的地址这跟数组名所具有的含义不一样所以要是需要。要求结构中第一个成员的首地址应该是结构变量名4. 结构的复杂形式一、嵌套结构一个结构成员之中能够涵盖别的一个结构这被叫做嵌套结构Turbo C对这种情况予以允许。嵌套。例如: 下面是一个有嵌套的结构struct string{char name;int age;struct addr address;} student;当中addr是另外一个结构的结构名一定需要先开展说明也就是。struct addr{char city;unsigned lon zipcode;char tel;若是打算给student这个结构里的成员address结构当中的zipcode进行赋值那么能够写成学生的地址里面的邮政编码等于二零零零零一。先将每个结构, 成员名从最外层开始, 逐个列出, 直到最内层, 这是嵌套式结构成员的表达, 标点符号。方式是:结构变量名.嵌套结构变量名.结构成员名其中嵌套结构能够存在好多好多。结构成员名是最内层结构里并非结构的成员名。二、位结构位结构属于一种特殊结构当存在按位访问一个字节或者一个字的多个位这种情况时位结构便出现这种情况 此时位结构。比按位运算符更加方便。位结构定义的一般形式为:struct位结构名{数据类型 变量名: 整型常数;数据类型 变量名: 整型常数;} 位结构变量;其中数据类型它必须是int这个int呢又分为unsigned或者signed这两种情况。而整型常数它必须是那种非负的整数。数其范围处于0到15之间它所表示的是二进制位的个数也就是表明了有多少位。变量名是选择项, 可以不命名, 这样规定是为了排列需要。例如: 下面定义了一个位结构。struct{unsigned incon: 8;/*incon占用低字节的0~7共8位*/unsigned txcolor:4;/*txcolor占用高字节的0~3位共4位*/unsigned bgcolor:3;/*bgcolor占用高字节的4~6位共3位*/无符号的闪烁其值为1这表示闪烁占用高字节的第7位。}ch;位结构成员的访问与结构成员的访问相同。例如: 访问上例位结构中的bgcolor成员可写成:ch.bgcolor注意:1. 位结构当中的成员能够被定义成unsigned也能够被定义成signed然而当成员的长度。其在度处于1的情形下将会被认定成是unsigned类型这是由于单个位根本就不可能具备符号。2. 位结构里的成员没法运用数组以及指针然而位结构变量能够是数组以及指针。如果是指针, 其成员访问方式同结构指针。3. 位结构的总长度也就是位数它是由各个位成员所定义的位数加起来得到的并且这个总长度能够超过两个字。节。4. 位结构成员可以与其它结构成员一起使用。例如:struct info{char name;int age;struct addr address;float pay;unsigned state: 1;unsigned pay: 1;}workers;’上例的结构对一个工从的信息予以了定义其中存在两个位结构成员每一个位结。构成员仅有一位所以仅占一个字节可是却保存了两个信息那个字节里面第一位用来表示工。关于人的状态其中第二位所表示的是工资是不是已经发放了。从这个情况可以察觉出运用位结构能够节省存贮空间。以下是个人观点补充一点知识typedef定义结构体的例如typedef struct person {int age ;char *name;char *sex;} student;我们能够借助student去定义一个结构体变量即student stu1 typedef的作用等同于给struct person取了一个别名 要是我们未使用typedef进行定义 的话 我们便无法运用student来定义 在这种情形下student乃是一个结构体变量 若要定义结构体变量的话 那就得依靠struct person来定义 也就是struct person stu1。typedef的其它定义typedef char name;若要对多个同质且长度为51的数组加以定义我们能够借由name来进行比方若有name sex;或许众人于此处理解起来存在一定难度倘若看过有关数据类型介绍范畴的知识大家便会很好理解抑或是经常运用java编写程序的人便会很好理解的。实际上我们能够将typedef char name【51】视作typedef char【51】name按照typedef的语法能够晓得name是为char name【51】所获取的别名。这下明白是怎么回事了吧。其实C结构体与对象编程就如同Java等里面的类那般极为相像。然而像C里对结构体做了扩展C里的结构体能够包含方法可C里面却不行啦。