当前所在位置:珠峰网资料 >> 计算机 >> 软件水平 >> 正文
程序员之程序设计知识点十二
发布时间:2010/6/2 15:31:37 来源:城市学习网 编辑:ziteng
  7.1 结构型和结构变量
  1.结构型
  结构型是由若干独立意义成员组成的复杂数据。定义一个结构型的一般形式为
  struct 结构型名{
  数据类型1 成员1名;
  数据类型2 成员2名;
  ……
  数据类型n 成员n名;
  };
  其中关键字“struct”引出结构型的定义。用花括号括住结构型的成员说明表,指明组成此结构型全部成员的数据类型和名称。结构型的成员也称为域。如某个系统的学生数据实体用如下结构型来描述:
  struct stdType {
  int num;/*学号*/
  char * name;/*姓名,允许姓名字符串长度可变,按需要申请*/
  char sex;/*性别‘M' 表示男生,'F’表示女生*/
  int age;/*年龄*/
  int score;/*成绩*/
  char *addr; /*家庭地址,允许地址字符串长度可变,按需要申请*/
  } ;
  上例定义结构型struct stdType,有六个成员。实际上,凡是相关的若干数据对象都可组合成一个结构,在一个结构名下进行管理。
  结构成员的数据类型可以是任何类型,包括前面定义的其它结构型,但是结构不能包含自身,而允许结构中可有这样的指针成员,指向如同定义一样的结构。
  2.结构变量
  结构型的变量就是结构变量,程序要使用结构数据,需定义结构变量。结构变量也简称结构。定义结构变量有以下几种不同的方法。
  (1)先定义结构型,再定义结构变量。如利用前面已定义的结构型struct stdType,以下代码
  struct stdType st1,st2,stdArray[200]
  定义结构变量st1、st2和结构数组stdArray。
  (2) 在定义结构型时,同时定义结构变量。如代码
  struct point {/*某绘图程序的坐标类型*/
  int x;
  int y;
  } p1,p2;
  定义struct point型变量 p1、p2。
  (3) 在定义无名结构型时,同时定义结构变量。如某种形式的结构型只是一次性定义几个变量,可以省略结构型名,直接定义结构变量。如由日、月、年组成的日期结构变量为:
  struct
  int day; /*日*/
  int month;/*月*/
  int year;/*年*/
  } date1,date2;/*定义两个日期变量datel和date2*/
  3.结构变量初始化
  在定义结构变量时,可同时给它置初值,称为结构变量初始化。结构变量初始化时,要按其结构型定义中的成员顺序逐一给出各成员的初值。如
  struct point2 /* 说明绘图程序的坐标类型*/
  int x;
  int y;
  } p3={ 20,50};
  结构变量初始化时,对初值表达式的要求与数组初始化对初值表达式的要求相同。
  4.结构变量的引用
  结构变量定义后,就可以用结构变量的名引用结构。 ANSI C还允许相同类型的结构变量相互赋值。
  5.结构变量成员的引用
  引用结构变量成员的标记形式为:
  结构变量名.成员名
  其中“.” 称为成员运算符。例如,datel.year引用结构变量datel的year成员。因该成员的类型为int型的,可以对它施行任何int型变量可施行的运算。例如,赋值运算datel.year=2000。如结构变量的某成员又是结构,要引用其成员的成员,则继续用成员运算符‘.’接上更内居的成员名。如结构变量的某成员是数组,要引用其成员的元素,则继续用数组元素的下标引用结构成员的元素。
  结构有多个成员,通常结构成员顺序地被安排在结构变量的内存决中,结构变量的地址是结构所占内存的开始地址,写成
  & 结构变量
  而结构成员的地址写成
  & 结构变量.成员名
  6.结构数组
  一般地,常用结构描述有复杂数据信息的个体,而用数组描述个体的集合。当数组的元素是结构时,这种数组就称为结构数组。如用结构型描述单个学生,而用结构数组表示一个班的学生。
  与定义结构变量的方法相仿,在前述所有定义结构变量的方法中,在变量名之后指定元素个数,就能定义结构数组,也可赋初值。
  如同元素为标准数据类型的数组一样,结构数组各元素在内存中也顺序存放,初始化时,逐一给数组的每个元素指定结构初值。
  对结构数组元素的访问也是利用数组元素下标的引用方法,若引用结构数组元素的成员,再用结构成员的引用方法,写成以下形式:
  结构数组名[元素下标]. 成员名
  即首先是指定数组的元素,再指定结构的成员。
  引用结构数组元素成员地址的标记方法为
  & 结构数组名[元素下标]. 成员名
  引用结构数组元素地址的标记方法为
  & 结构数组名[元素下标]
  引用结构数组首元素地址的标记方法为
  结构数组名 [NextPage]   7.结构指针变量
  把结构变量s所占据的存储段开始地址赋给能指向该结构的指针变量p,就说指针p指向结构变量s。指针p是一个结构指针变量,简称结构指针。定义结构指针的方法,与定义一般指针变量一样,当类型区分符是结构型时,所定义的指针变量即为结构指针。如代码
  struct date *pd, d;
  定义结构指针pd和结构变量成其中,指针变量pd能指向类型为struct date的结构。赋值代码 pd=&d,使指针pd指向结构变量d。
  由指向结构的指针引用结构成员的标记形式为
  结构指针变量名->成员名
  其中“ ->”称为指向成员运算符。例如,如下代码:
  pd->day /* 引用结构变量d的成员day*/
  pd_>month /*引用结构变量d的成员month */
  pd-> year /* 引用结构变量d的成员year */
  表达式“* 指针变量” 表示指针变量所指对象,所以通过指针引用其所指结构的成员也可写成以下形式:
  (*指针变量). 结构成员名
  这里圆括号是必需的,因为运算符“*”的优先级低于运算符“.”,但是几乎不用这种标记方法,习惯都采用指向成员运算符“->”来标记。
  8.指向结构数组元素的指针
  结构指针变量也可指向结构数组的某个元素。如有定义:
  struct stdType std[50], *ps,*p;
  代码:
  ps=&std[2];
  p=std;
  使指针ps指向结构std[2],指针p指向结构std[0]。
  通过指针引用它所指数组元素的成员与指向普通结构一样,如代码 ps-> score引用std[2].score;而代码 p-> score引用std[0].score。
  当结构指针ps指向结构数组的元素std[k] 时,表达式ps+n表示指向结构数组元素 std[k+n]。利用指向结构数组元素的指针,引用结构数组元素的成员又有多种表示形式:
  (1) 利用结构数组元素的指针引用它所指数组元素的成员:
  指针变量->成员名 /* 几乎都这样用 */
  指针变量[0]. 成员名 /* 几乎不用 */
  ( *指针变量).成员名 /* 几乎不用 */
  (2) 利用结构数组元素的指针引用离它所指元素i个元素的成员:
  ( 指针变量+i)->成员名 /* 常用 */
  指针变量[i].成员名 /* 最常用 */
  ( *(指针变量+i)).成员名 /* 几乎不用 */
  以下代码序列实现在结构数组std的前n个元素中找最高分的那个结构,并由指针p指向该结构:
  P= std; /* 等价于p=&std[0] */
  for(ps=p+1; ps
  if(ps-> score> p-> score) p=ps;
  【例 7.1】 以下函数 dayofYear()利用月份天数表,已知日、月、年,计算年中的第几天。
  int dTbl[][12] ={{31,28,31,30,31,30,31,31,30,31,30,31},/*平年*/
  {31,29,31,30,31,30,31,31,30,31,30,31}}; /* 闰年 */
  int dayofYear( int d,int m,int y) /*计算年中第几天 */
  { int i, leap, day=d;
  leap=(y%4==0 && y%100)||y%400==0;
  for( i=0; i
  day += dTbl[leap][i];
  return day;
  }
  9.在函数间传递结构数据
  在函数间传递结构数据主要有以下几种形式:
  (1) 共用全局的外部结构变量。
  (2) 函数设置结构形式参数。
  (3) 函数返回结构值。
  (4) 函数设置结构指针形式参数。
  以函数 dayofYear()为例,设有以下形式的结构类型 struct date,以该类型的结构为形式参数,改写该函数为
  struct date {
  int day;
  int month;
  int year;
  int yearDay;
  char * monthName;
  } date;
  int dayofYear(struct date d)
  { int i,leap,day=d.day;
  leap =(d.year%4==0 && d.year%l00) ||d.year%400==0;
  for( i=0;i
  day += dTbl[leap][i];
  return day;
  }
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved