6)结构型与自定义类型

 

结构型的定义

  基本数据类型是系统提供的数据类型,而结构类型是用户在程序中自己定义的一种数据类型。这种结构型必须先定义,然后才能用已经定义的结构型来定义相应的变量、数组、指针等。

  特点:可以自己定义一种数据类型来存放类型不同的数据。这种数据类型就称为“结构型”。结构型又称“结构体型”。

  例如:姓名是字符串型(用字符数组来存放);

  性别是字符型(用‘m’表示男性、用‘f’表示女性);

  年龄是整型;

  工资是实型。

  struct person{

    char name[10]

    char sex;

    int age;

    float wage;

  }

  这样就可以定义含有一个字符数组、一个字符型、一个整型、一个实型的数据为一个结构型数据。

  结构型的定义

  struct 结构型名{

    数据类型符1 成员1 名;

    。。。。。。。。

    数据类型符n 成员n 名;

};

其中:结构型名  是用户取得标识符。

  结构类型符  可以是基本类型说明符,也可以是已定义过的某种结构型

  成员名    可以是标识符、标识符[长度]、*标识符等。

成员也称“域”、“结构分量”。

  注意:结构型仅仅是一种数据类型,系统并不会给结构型成员分配内存。已经定义的某种结构型可以作为一种数据类型,当用来定义变量、数组、指针变量时,才会给定义的变量、数组、指针变量分配内存。

结构型变量的定义和成员的引用

  1)结构型变量成员的引用

  1.结构性变量成员的引用方法如下。

  结构型变量名.  成员名

  其中的“.” 称为成员运算符,是双目中缀运算符。前一个对象必须是结构型的变量(或结构型数组元素),后一个对象是该结构型的成员名。

  例如:struct xy{int x; float y[10];}xy1={1,{1.0,2.0,3.0}};

  xy1.x  //相当于一个整型变量,其值为1.

  xy1.y  //相当于一个实型数组的首地址。

  xy1.y[1]  //相当于一个实型数组元素,其值为2.0

  下列引用是错误的:xy.x  xy是结构型名称,不是该结构型变量(或数组元素)

  2)结构型变量成员地址的引用方法

  如下:

  成员时变量形式的变量地址:  &结构型变量名. 成员名

  成员是数组形式的变量地址:  结构型变量名. 成员名

  成员时数组,其数组元素的地址:  &结构型变量名. 成员数组[下标]

  例子:struct student2{long number; char name[10];};

  void main(){

    struct student2 x;

    long * p_number;

    char *p_name;

    p_number=&x.number;//让指针变量分别执行结构型变量x的两个成员

    p_name=x.name

    *p_number=100001L;

    strcpy(p_name,"zhao1");

}

  3)结构型变量地址的引用方法

  如下:

  &结构型变量名

  注意,存放结构型变量地址的指针变量必须是相同结构型的结构型指针变量。

结构型数组的定义和数组元素成员的引用

  1)结构型数组的定义和初始化

  例如,定义一个学生数组,可以使用下列三种方法

  1.先定义结构型,然后再定义结构型数组并赋初值。

  2.定义结构性的同时定义数组并赋初值。

  3.定义无名成的结构型的同时定义数组并赋初值。

  struct student {

    long number;

    char name[10];

    char sex;

    float score[3];

};

  struct student s[3]={

    {200001L,"qian2",'m',{78,89,98}},

    {200001L,"qian2",'m',{78,89,98}},

    {200001L,"qian2",'m',{78,89,98}}

}

  2)结构型数组元素成员的引用

  1.构型数组元素成员的引用

  引用方法如下:

  结构型数组名[下标].成员名

  struct students{

    long number;

    char name[10];

  }s[4];  //定义student2结构型数组s

  void main(){

    s[0].number=100001L;//给结构型数组元素s[0]的成员number复制

    strcpy(s[1].name,"sun3");//给结构型数组元素s[1]的成员name[]赋值。

  }

  2)结构型数组元素成员地址的引用方法

  &结构型数组名[下标]. 成员名

  struct students{

    long number;

    char name[10];

  };

  void main(){

    struct student2 s[2];

    long *p_number;

    char * p_name;

    p_number=&s[0].number;//长整形指针变量指向结构型数组元素s[0]的成员number;

    p_name=s[1].name;//字符型指针变量指向结构型数组元素s[1]的成员name数组.

    *p_number=100001L;

    strcpy(p_name,"sun3");

  }

  3)结构型数组元素地址的引用方法

  &结构型数组名[下标]

  存放结构型数组元素地址的指针变量必须是类型相同的结构型指针。

指向结构型数据的指针变量的定义和使用

  1)指针变量指向数组元素

  如果有一个结构型数组元素的地址已赋予相同结构型指针变量,可以使用下列两种方式来引用该元素的成员,其作用完全相同。

  方式1  (*指针变量).成员名

  方式2  指针变量->成员名

  注意:这里的指针变量必须已经指向某个结构型数组元素。例如,它指向的数组元素为“数组名[k]”,则上述两种引用方式均代表“数组名[k].成员名”

  2)指针变量指向数组

  方式1  (*(指针变量+k)).成员名

  方式2  (指针变量+k)->成员名

  注意,这里的指针变量必须已经指向某个结构型数组,则上述两种引用方式均代表“数组名[k].成员名”。

在函数间传递结构型数据

  1)使用全局外部变量传递结构型数据

  使用全局外部变量传递结构型数据时,只要在程序的开头定义结构型及其变量或数组,就可以在其后定义的函数间传递结构型数据。

  #define N 10;

  struct student3{long num; char name[10]; int age;}stu[N];

  void my_in(){

    int i ;

    for(i=0;i<N;i++){

      scanf("%s",stu[i].name);

    }

    return;

  }

void main(){

  int i;

  my_in();

  for(i=0;i<N;i++){

    printf("%s",stu[i].name);

  }

}

2)使用返回值方式传递结构型数据。

  使用返回值方式只能返回1个结构型数据,定义函数时的数据类型符必须是某种已定义的结构型,利用“return(表达式)”;

  define N 10;

  struct student3{long num; char name[10]; int age;};

  struct student3 my_in(){

    int i ;

    struct student3 stu1;

    scanf("%s",&sut1.name);

    return(stu1);

}

void main(){

  int i ;

  struct student3 stu[N];  //定义结构型student3的数组stu;

  for(i=0;i<N;i++){

    stu[i]=my_in();  //将函数返回值存入结构型数组元素。

  }

  for(i=0; i<N; i++){

    printf("%s",stu[i].name);

  }

}

3)使用形参与实参方式传递结构型数据。

  1.使用地址参数方式。

  使用地址传送方式,形参应被说明成某种结构型的数组或指针变量,而对应实参必须是同一种结构型的变量地址、数组名、数组元素地址、已赋值的指针变量。

  2.使用值传递方式

  使用值传递方式,形参应为变量形式,并要说明成某种结构型,而对应的实际参数必须是同一种结构型的变量或数组元素。

posted @ 2017-09-29 11:41  君子喻于义  阅读(369)  评论(0编辑  收藏  举报