当前所在位置:珠峰网资料 >> 计算机 >> 计算机等级考试 >> 正文
2015年计算机等级考试二级C语言基础教程:指针、结构、联合和枚举(3)
发布时间:2010/11/2 16:31:48 来源:城市学习网 编辑:ziteng
  2.结构变量的使用
  结构是一个新的数据类型,因此结构变量也可以象其它类型的变量一样赋值、运算,不同的是结构变量以成员作为基本变量。
  结构成员的表示方式为:
  结构变量.成员名
  如果将"结构变量.成员名"看成一个整体,则这个整体的数据类型与结构中该成员的数据类型相同,这样就可象前面所讲的变量那样使用。
  下面这个例子定义了一个结构变量,其中每个成员都从键盘接收数据,然后对结构中的浮点数求和,并显示运算结果,同时将数据以文本方式存入一个名为wage.dat的磁盘文件中。请注意这个例子中不同结构成员的访问。
  例3:
  #include <stdio.h>
  main()
  {
  struct{ /*定义一个结构变量*/
  char name[8];
  int age;
  char sex[2];
  char depart[20];
  float wage1, wage2, wage3, wage4, wage5;
  }a;
  FILE *fp;
  float wage;
  char c='Y';
  fp=fopen("wage.dat", "w"); /*创建一个文件只写*/
  while(c=='Y'||c=='y') /*判断是否继续循环*/
  {
  printf("\nName:");
  scanf("%s", 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);
  wage=a.wage1+a.wage2+a.wage3+a.wage4+a.wage5;
  printf("The sum of wage is %6.2f\n", wage);/*显示结果*/
  fprintf(fp, "%10s%4d%4s%30s%10.2f\n", /*结果写入文件*/
  a.name, a.age, a.sex, a.depart, wage);
  while(1)
  {
  printf("Continue?<Y/N>");
  c=getche();
  if(c=='Y'||c=='y'||c=='N'||c=='n')
  break;
  }
  }
  fclose(fp);
  }
  3.结构数组和结构指针
  结构是一种新的数据类型,同样可以有结构数组和结构指针。
  一、结构数组
  结构数组就是具有相同结构类型的变量集合。假如要定义一个班级40个同学的姓名、性别、年龄和住址,可以定义成一个结构数组。如下所示:
  struct{
  char name[8];
  char sex[2];
  int age;
  char addr[40];
  }student[40];
  也可定义为:
  struct string{
  char name[8];
  char sex[2];
  int age;
  char addr[40];
  };
  struct string student[40];
  需要指出的是结构数组成员的访问是以数组元素为结构变量的,其形式为:
  结构数组元素.成员名
  例如:
  student[0].name
  student[30].age
  实际上结构数组相当于一个二维构造,第一维是结构数组元素,每个元素是一个结构变量,第二维是结构成员。
  注意:
  结构数组的成员也可以是数组变量。
  例如:
  struct a
  {
  int m[3][5];
  float f;
  char s[20];
  }y[4];
  为了访问结构a中结构变量y[2]的这个变量,可写成
  y[2].m[1][4] [NextPage]   二、结构指针
  结构指针是指向结构的指针。它由一个加在结构变量名前的"*" 操作符来定义,例如用前面已说明的结构定义一个结构指针如下:
  struct string{
  char name[8];
  char sex[2];
  int age;
  char addr[40];
  }*student;
  也可省略结构指针名只作结构说明,然后再用下面的语句定义结构指针。
  struct string *student;
  使用结构指针对结构成员的访问,与结构变量对结构成员的访问在表达方式上有所不同。结构指针对结构成员的访问表示为:
  结构指针名->结构成员
  其中"->"是两个符号"-"和">"的组合,好象一个箭头指向结构成员。例如要给上面定义的结构中name和age赋值,可以用下面语句:
  strcpy(student->name, "Lu G.C");
  student->age=18;
  实际上,student->name就是(*student).name的缩写形式。
  需要指出的是结构指针是指向结构的一个指针,即结构中第一个成员的首地址,因此在使用之前应该对结构指针初始化,即分配整个结构长度的字节空间,这可用下面函数完成,仍以上例来说明如下:
  student=(struct string*)malloc(size of (struct string));
  size of (struct string)自动求取string结构的字节长度,malloc()函数定义了一个大小为结构长度的内存区域,然后将其诈地址作为结构指针返回。
  注意:
  1.结构作为一种数据类型,因此定义的结构变量或结构指针变量同样有局部变量和全程变量,视定义的位置而定。
  2.结构变量名不是指向该结构的地址,这与数组名的含义不同,因此若需要求结构中第一个成员的首地址应该是&[结构变量名]。
  3.结构的复杂形式
  一、嵌套结构
  嵌套结构是指在一个结构成员中可以包括其它一个结构,Turbo C允许这种嵌套。
  例如:下面是一个有嵌套的结构
  struct string{
  char name[8];
  int age;
  struct addr address;
  } student;
  其中:addr为另一个结构的结构名,必须要先进行说明,即
  struct addr{
  char city[20];
  unsigned lon zipcode;
  char tel[14];
  }
  如果要给student结构中成员address结构中的zipcode赋值,则可写成:
  student.address.zipcode=200001;
  每个结构成员名从最外层直到最内层逐个被列出,即嵌套式结构成员的表达方式是:
  结构变量名.嵌套结构变量名.结构成员名
  其中:嵌套结构可以有很多,结构成员名为最内层结构中不是结构的成员名。
  二、位结构
  位结构是一种特殊的结构,在需按位访问一个字节或字的多个位时,位结构比按位运算符更加方便。
  位结构定义的一般形式为:
  struct位结构名{
  数据类型 变量名: 整型常数;
  数据类型 变量名: 整型常数;
  } 位结构变量;
  其中:数据类型必须是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位*/
  unsigned blink: 1; /*blink占用高字节的第7位*/
  }ch;
  位结构成员的访问与结构成员的访问相同。
  例如: 访问上例位结构中的bgcolor成员可写成:
  ch.bgcolor
  注意:
  1.位结构中的成员可以定义为unsigned,也可定义为signed,但当成员长度为1时,会被认为是unsigned类型。因为单个位不可能具有符号。
  2.位结构中的成员不能使用数组和指针,但位结构变量可以是数组和指针,如果是指针,其成员访问方式同结构指针。
  3.位结构总长度(位数),是各个位成员定义的位数之和,可以超过两个字节。
  4.位结构成员可以与其它结构成员一起使用。
  例如:
  struct info{
  char name[8];
  int age;
  struct addr address;
  float pay;
  unsigned state: 1;
  unsigned pay: 1;
  }workers;'
  上例的结构定义了关于一个工从的信息。其中有两个位结构成员,每个位结构成员只有一位,因此只占一个字节但保存了两个信息,该字节中第一位表示工人的状态,第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。
  联合(union)
  1.联合说明和联合变量定义
  联合也是一种新的数据类型,它是一种特殊形式的变量。
  联合说明和联合变量定义与结构十分相似。其形式为:
  union 联合名{
  数据类型 成员名;
  数据类型 成员名;
  ...
  } 联合变量名;
  联合表示几个变量公用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。
  下例表示说明一个联合a_bc:
  union a_bc{
  int i;
  char mm;
  };
  再用已说明的联合可定义联合变量。
  例如用上面说明的联合定义一个名为lgc的联合变量,可写成:
  union a_bc lgc;
  在联合变量lgc中,整型量i和字符mm公用同一内存位置。
  当一个联合被说明时,编译程序自动地产生一个变量,其长度为联合中最大的变量长度。
  联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,但定义为指针时,也要用"->"符号,此时联合访问成员可表示成:
  联合名->成员名
  另外,联合既可以出现在结构内,它的成员也可以是结构。
  例如:
  struct{
  int age;
  char *addr;
  union{
  int i;
  char *ch;
  }x;
  }y[10];
  若要访问结构变量y[1]中联合x的成员i,可以写成:
  y[1].x.i;
  若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成:
  *y[2].x.ch;
  若写成"y[2].x.*ch;"是错误的。
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved