一、结构体

   是一种复合的数据类型,由多个不同类型的数据(为结构体的成员)组成的集合。

   在c语言中没有给出结构体这种类型具体的形式(名称),但是给出类定义该结构体类型的方法(格式)。

   在使用结构体类型时,必须先定义机构体具体的类型,然后用定义好的类型来定义变量,进而使用变量。

  综上,结构体是一种自定义的复合数据类型,在结构体空间中每个成员都有各自的空间。

   1.结构体的类型定义:           

 struct [结构体标签]{
类型名 成员名;
类型名 成员名;
... ...
类型名 成员名;
}; struct student{
int sno;
char name[];
float high;
float score;
};

struct

   2.结构体变量的定义:

 //1.常规方式定义
struct student1{
int sno;
char name[];
float high;
float score;
};
struct student1 st1; //2.与类型同时定义
struct student2{
int sno;
char name[];
float high;
float score;
}st2; //3.直接定义
struct{
int sno;
char name[];
float high;
float score;
}st3;

structDefine

   3.结构体变量的初始化:

    1》完全初始化:按定义成员的先后顺序依次给结构体变量中的每一个成员赋值的过程:struct student st = {1001, "刘德华",1.80,99.9};

    2》部分初始化:按定义成员的先后顺序依次给结构体变量中的前若干个成员赋值的过程:struct student st = {1001, "刘德华", 1.80};

    3》指定成员初始化:不按成员的定义顺序赋值,而是指定结构体变量中的某一些成员赋值的过程:struct student st = {.name = "刘德华", 1.80, .sno = 1001};//指定成员初始化

   4.结构体的使用:

    1》不能只能赋值,例如:

      struct student st;

      st = {1001, "刘德华", 1.80, 99.9};//error

    2》相同类型结构体变量之间可以相互赋值,例如:

      struct student st1 = {1001,"刘德华", 1.80, 99.9};

      struct student st2;

      st2 = st1;//OK

    3》结构体中的成员只能单独使用,例如:   

 /*******************************************************************
* > File Name: 33-struct.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Sun 08 Oct 2017 11:48:04 AM CST
******************************************************************/ #include <stdio.h>
#include <string.h> struct student{
int sno;
char name[];
float high;
float score;
}; int main(int argc, char* argv[])
{
struct student st1 = {, "刘德华", 1.80, 99.9};//完全初始化
struct student st2; st2.sno = ;
strcpy(st2.name, "peter");
st2.high = 1.89;
st2.score = 98.4;
printf("%d\t%s\t%.2f\t%.2f\n", st1.sno, st1.name, st1.high, st1.score);
printf("%d\t%s\t%.2f\t%.2f\n", st2.sno, st2.name, st2.high, st2.score); return ;
}

struct.c

   5.结构体数组:

    元素为结构体类型的数组称之为结构体数组。

 /*******************************************************************
* > File Name: 34-structArr.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Sun 08 Oct 2017 03:58:37 PM CST
******************************************************************/ #include <stdio.h> struct student{
int sno;
char name[];
float high;
float score;
}; int main(int argc, char* argv[])
{
struct student st[];
int i; for(i = ; i< ; i++){
printf("Pls input NO[%d]:\n", i);
scanf("%d%s%f%f", &st[i].sno, st[i].name, &st[i].high, &st[i].score);
} for(i = ; i< ; i++){
printf("%d\t%s\t%.2f\t%.2f\n", st[i].sno, st[i].name, st[i].high, st[i].score);
} return ;
}

structArr.c

   6.结构体指针:

    指向结构体变量的指针称为结构体指针。

 /*******************************************************************
* > File Name: 35-structPoint.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Sun 08 Oct 2017 04:08:58 PM CST
******************************************************************/ #include <stdio.h> struct student{
int sno;
char name[];
float high;
float score;
}; int main(int argc, char* argv[])
{
struct student st1 = {, "刘德华", 1.80, 99.9};
struct student *ps;//ps为结构体指针 ps = &st1; printf("%d\t%s\t%.2f\t%.2f\n", st1.sno, st1.name, st1.high, st1.score);
puts("");
printf("%d\t%s\t%.2f\t%.2f\n", (*ps).sno, (*ps).name, (*ps).high, (*ps).score);
puts("");
printf("%d\t%s\t%.2f\t%.2f\n", ps -> sno, ps -> name, ps -> high, ps -> score); return ;
}

structPoint.c

二、共用体

   一种复合的数据类型,它是由多个不同类型的数据组成的集合,这些不同类型的数据称为该共用体的成员。

   在C语言中没有给出共用体这种类型具体的形式(名称),但是给出类定义该共用体类型的方法(方法),在使用共用体类型时,必须先定义共用体具体的类型,然后用定义好的类型来定义变量,进而使用变量。

  1.共用体类型定义:  

 /*******************************************************************
* > File Name: 36-unionTypeDefine.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Sun 08 Oct 2017 04:34:53 PM CST
******************************************************************/ #include <stdio.h> #if (0)
union [结构体标签]{
类型名 成员名;
类型名 成员名;
... ...;
类型名 成员名;
};
#else//egg
union student{
int sno;
char name[];
float high;
float score;
};
#endif int main(int argc, char* argv[])
{
return ;
}

UnionTypeDefine.c

  2.共用体变量的定义:

 /*******************************************************************
* > File Name: 37-unionVarDefine.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Sun 08 Oct 2017 04:40:50 PM CST
******************************************************************/ #include <stdio.h> //1》.常规定义
union student{
int sno;
char name[];
float high;
float score;
};
union student un;
//2》.与类型同时定义
union student{
int sno;
char name[];
float high;
float score;
}un;
//3》.直接定义
union{
int sno;
char name[];
float high;
float score;
}un; int main(int argc, char* argv[])
{
return ;
}

unionVarDefine.c

  3.使用:

    1》不能整体赋值,例如:

      union student un;

      un = {1001, "刘德华", 1.80, 99.9};//error

    2》同类型的共用体之间可以相互赋值,例如:

      union student un1, un2;

      un1.sno = 1001;

      un2 = un1;//OK

    3》共用体中的成员只能单独使用,例如:   

 /*******************************************************************
* > File Name: 38-union.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Sun 08 Oct 2017 04:52:12 PM CST
******************************************************************/ #include <stdio.h>
#include <string.h> //定义一个共用体类型
union student{
int sno;
char name[];
float high;
float score;
}; int main(int argc, char* argv[])
{
union student un1; un1.sno = ;
strcpy(un1.name, "jack");
un1.high = 1.80;
un1.score = 93.5;
printf("%d\t%s\t%f\t%f\n", un1.sno, un1.name, un1.high, un1.score);
puts("***********************************************************"); un1.sno = ;
strcpy(un1.name, "jack");
un1.score = 93.5;
un1.high = 1.80;
printf("%d\t%s\t%f\t%f\n", un1.sno, un1.name, un1.high, un1.score);
puts("***********************************************************"); un1.sno = ;
un1.high = 1.80;
un1.score = 93.5;
strcpy(un1.name, "jack");
printf("%d\t%s\t%f\t%f\n", un1.sno, un1.name, un1.high, un1.score);
puts("***********************************************************"); strcpy(un1.name, "jack");
un1.high = 1.80;
un1.score = 93.5;
un1.sno = ;
printf("%d\t%s\t%f\t%f\n", un1.sno, un1.name, un1.high, un1.score);
puts("***********************************************************"); printf("\n&un1\t=%p\n", &un1);
printf("&un1.sno\t=%p\n", &un1.sno);
printf("&un1.name\t=%p\n", &un1.name);
printf("&un1.high\t=%p\n", &un1.high);
printf("&un1.score\t=%p\n", &un1.score); printf("\n&un1 + 1\t=%p\n", &un1 + );
printf("&un1.sno + 1\t=%p\n", &un1.sno + );
printf("&un1.name + 1\t=%p\n", &un1.name + );
printf("&un1.high + 1\t=%p\n", &un1.high + );
printf("&un1.score + 1\t=%p\n", &un1.score + ); return ;
}

union.c

      运行结果:

 

三、枚举

  属于基本数据类型,本质上为整型。为了提高程序的可读性。

  在某些时候需要给一些整型数据一个取值空间,这时如果直接赋值整型常量,它的含义不是特别的明确,从而导致程序的可读性差。

  引入枚举类型之后,可以重新定义整型数据的取值空间,这样可以提高程序的可读性。

  1.枚举类型的定义

 /*******************************************************************
* > File Name: 39-enum.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Sun 08 Oct 2017 05:35:54 PM CST
******************************************************************/ #include <stdio.h> #if (枚举类型的定义)
enum [枚举标签]{
枚举常量;
枚举常量;
......;
枚举常量;
};
#else
/*定义一个枚举类型spectrum*/
enum spectrum{
red, //默认值0
blue, //
green, //
yellow //
}color;
#endif int main(int argc, char* argv[])
{
return ;
}

enumTypeDefine.c

  2.枚举类型中枚举、常量的值

 /*******************************************************************
* > File Name: 40-enum.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Sun 08 Oct 2017 05:42:52 PM CST
******************************************************************/ #include <stdio.h> //1》.枚举常量的默认值
enum spectrum{
red, //
blue, //
green, //
yellow //
}color;
//2》.枚举常量也可以指定值
enum spectrum{
red = ,//不是赋值,而是指定枚举常量red代表整型常量10
blue, //the default value :11
green = ,
yellow //the default value :10
}color; int main(int argc, char* argv[])
{
return ;
}

enumVal.c

  3.使用:

 /*******************************************************************
* > File Name: 41-enum.c
* > Author: fly
* > Mail: XXXXXXXX@icode.com
* > Create Time: Sun 08 Oct 2017 05:51:54 PM CST
******************************************************************/ #include <stdio.h> enum spectrum{
red, //
blue, //
green, //
yellow //
}color1; int main(int argc, char* argv[])
{
enum spectrum color2; color1 = ; //可读性差
color1 = red; //可读性好
printf("color1 = %d\n", color1); color2 = ;
color2 = green;
printf("color2 = %d\n", color2); return ;
}

enum.c

07.C语言:结构体、共用体、枚举的更多相关文章

  1. C++结构、共用体、枚举

    一.结构 结构是C++OOP的基石.学习有关结构的知识僵尸我们离C++的核心OOP更近. 结构是用户定义的类型,同一个结构可以存储多种类型数据,这使得将一个事物的不同属性构成一个对象成为了可能.另外C ...

  2. 5、数组&字符串&结构体&共用体&枚举

    程序中内存从哪里来 三种内存来源:栈(stack).堆(heap).数据区(.date): 栈(stack) 运行自动分配.自动回收,不需要程序员手工干预: 栈内存可以反复使用: 栈反复使用后,程序不 ...

  3. C语言高级-结构,共用体,文件,链表

    C语言结构 标准声明方式 struct student{        int age;        char sex;    }; 这个可以在main函数中定义:  struct student ...

  4. C语言笔记 09_共用体&typedef&输入|输出

    共用体 共用体允许您在相同的内存位置存储不同的数据类型.您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值.共用体提供了一种使用相同的内存位置的有效方式. 定义共用体 为了定义共用体, ...

  5. 瘋子C语言笔记(结构体/共用体/枚举篇)

    (一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student { int num; char name ...

  6. C语言基础 (11) 结构体 ,共用体 枚举 typedef

    1 课堂回顾 作用域与生命周期 2 static 局部变量 2 打字游戏 3 内存分区代码分析 4 结构体基本操作 (复合类型[自定义类型 #include <stdio.h> #incl ...

  7. C++复合类型(结构,共用体,枚举)

    •结构是用户定义的类型,而结构的声明定义了这种类型的数据属性. 一.关键字struct声明:   定义了一种新类型 struct inflatable{ char name[20];//结构成员 fl ...

  8. C语言中的共用体(union)和枚举(enum)

    1 union union Data{ int i; char ch; float f; }a={1, 'a', 1.5}; //错误 union Data a = {16}; //正确 union ...

  9. (转)C语言union(联合体 共用体)

    一直以来,union都是个很少用到的东西,对于这些不常用的结构往往记不住.这次看书又看到了,还是学习一下吧.一般在Windows API的一些数据结构中才能看到这个union,其实并不复杂.本质上来说 ...

  10. 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符

    [源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...

随机推荐

  1. bzoj1036 [ZJOI2008]树的统计Count——LCT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1036 LCT水题! 然而没有1A(咬牙)! 注意值有负数,所以取 max 的话要把作为“哨兵 ...

  2. javascript BOM基本知识

    1.BOM(Bowser Object Model浏览器对象模型) 浏览器创建的对象通常称作文档(Document)对象,它是浏览器使用的众多对象的一部分,浏览器操作的对象结合起来称作浏览器对象模型( ...

  3. SSM整合配置错误记录

    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'dic ...

  4. java笔记线程方式1获取对象名称

    * 如何获取线程对象的名称呢? * public final String getName():获取线程的名称. * 如何设置线程对象的名称呢? * public final void setName ...

  5. js工作备注

    { field : 'state', title : '事件状态', align: 'center', width : 120, formatter : function(value, row, in ...

  6. 清北考前刷题da5下午好

    /* (4,1)*(3,1)*(2,1)的话1变成2然后一直是2 2变成1然后变成3 3变成1然后变成4 4变成1 */ #include<iostream> #include<cs ...

  7. 商品期货高频交易策略Tick框架

    原帖地址:https://www.fmz.com/bbs-topic/1184在商品期货高频交易策略中, Tick行情的接收速度对策略的盈利结果有着决定性的影响,但市面上大多数交易框架,都是采用回调模 ...

  8. Head Html Css 第二版笔记

    一. 引用 <blockquote>ago aog aogag </blockquote> 则是引用一大段文字并独立显示 二. <a> 创建目的地 <h2&g ...

  9. python获取主机名和用户名

    import socketimport getpassuser_name = getpass.getuser() # 获取当前用户名hostname = socket.gethostname() # ...

  10. 图片分离,试用于各种文件跨站传输,post方法传输

    主要思想:把不通形式的文件或者文字,以字节编码流的形式传递过去然后反解析后重新生成原文件 //------------------------------发送部分------------------- ...