C语言复习之建立自己的数据类型

  C语言允许用户根据自己的需要建立自己的数据类型。

1.      定义和使用结构体变量

1.1结构体

结构体:C语言允许用户建立不同数据类型组成的组合型数据结构(有些高级语言称为记录record)

   定义

struct 结构体名

{成员列表};

结构体的成员定义:类型名 成员名;

 

注:

一般结构体名第一个字母大写。

成员可以是另一个结构体类型。

  struct Date

{

   int month;

   int day;

   int year;

};

 

struct Student

{

   int num;

   char name[20];

   char sex;

   int age;

   struct Date birthday;

   char addr[30];

};

 

1.2   定义结构体变量

1.2.1先声明结构体变量,再定义该类型的变量

      structStudent

{

   int num;

   char name[20];

   char sex;

   int age;

   float score;

   char addr[30];

};

 

 struct Student student1,student2;

或者

      structStudent

{

   int num;

   char name[20];

   char sex;

   int age;

   float score;

   char addr[30];

}student1,student2;

 

在定义了结构体变量时系统会位置分配内存空间

         student1所占的内存:4+20+1+4+4+30=63

         但是如果sizeof(structStudent student1)必然是64,因为计算机对内存的管理是以‘字’为单位,一个字节占不满一个字也不会存放数据。因此分配的字节数必然是4个倍数

   1.2结构体变量的初始化和引用。

       (1)在定义结构体变量时进行初始化:

            struct Student b={.name=”xiaowang”};

             .name 是b.name 的隐含写法。其他没有初始化的成员,数值型被系统初始化为0,字符型成员被初始化为’\0’,指针型成员被初始化为NULL

        (2)引用某个成员进行赋值:

             student1.num=10010;

             student2.birthday.month=12;

         (3)结构体变量的成员和普通变量相同,可以进行各种运算

         (4)同类型结构变量可以相互赋值

 

2.      使用结构体数组

struct Student stu[10];

3.      结构体指针

      3.1定义:struct Student *pt=student1;

            通过指针可以引用结构体的各个成员。

            使用指向运算符->       pt->name=12;

 

      

      3.2指向结构体数组的指针。

          struct Student stu[10],*ps=stu;

          ps++,ps--,ps+1,ps-1,都是以每个结构体变量为单位的,指向

      注意 (++p)->num 和(p++)->num区别,后者先算p->num的值然后p++

          如果:ps=stu[0].name; 编译会发出警告:数据类型不匹配,可以用强制类型转换               ps=(structStudent *)stu[0].name;    

    

       3.3用结构体变量和结构体指针作为参数

          一般不用结构体变量作为实参,不能将处理结果返回,一般用指针。

 

 

综合例子:   有n个结构体变量,内含学生学号姓名和三门课的成绩。要求输出平均成绩最高的那个学生的信息

 

#include <stdio.h>

#define N 3


struct Student
{
    int num;
    char name[20];
    float score[2];

};

int main()
{
    void input_message(struct Student *ps);
    void process(struct Student *ps);

    struct Student stu[N];

    input_message(stu);
    process(stu);

    return 0;
}

void input_message(struct Student *ps)
{
    int i;
    struct Student *p=ps;
    printf("Input the message of students:\n");
    printf("num  name  socre1  score2\n");
    for(i=0;i<N;i++)
    {
        scanf("%d%s%f%f",&p->num,p->name,&p->score[0],&p->score[1]);
        p++;
    }
}

void process(struct Student *ps)
{
    int i;
    struct Student *p=ps,*p_max=ps;

    for(i=0;i<N-1;i++)
    {
        if((p->score[0]+p->score[1])>((p+1)->score[0]+(p+1)->score[1]))
            p_max=p;
        else
            p_max=p+1;
        p++;
    }
    printf("num:%d   name:%s    score:%f  %f\n",p_max->num,p_max->name,p_max->score[0],p_max->score[1]);
}


 

4.共用体类型

5. 枚举类型

   enum Weeday{sun,mon,tue,wed,thu,fri,sat};

   enum Weekday workday,weekend;(链各个枚举类型变量)

声明枚举类型格式:

    enum [类型名] {枚举元素列表}

注意:

(1)      C编译对枚举类型的枚举元素按常量处理。

(2)      每个枚举元素代表一个整数,C语言编译按照定义的顺序默认它们的值0,1,2,3(也可以自己指定如workday=mon)

(3)      枚举元素可以用来作比较if(workday==mon)

#include <stdio.h>

enum Weekday{sun,mon,tue,wed,thu,fri,sat};

int main()
{
      printf("%d\n",sun);
      printf("%d\n",sat);

    return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值