• 主页
  • tags
  • 所有文章
所有文章 友链 关于我

  • 主页
  • tags
  • 所有文章

C语言03_构造类型 数组, 结构体, 共用体, 枚举类型介绍

2018-02-05
阅读量

文章导航

× 文章目录
  1. 1. C语言构造类型:
    1. 1.1. 1. C语言中构造类型分为以下四种:
      1. 1.1.1. 1) 数组
      2. 1.1.2. 2) 结构体
      3. 1.1.3. 3) 共用体
      4. 1.1.4. 4) 枚举类型

C语言构造类型:

1. C语言中构造类型分为以下四种:

  • 数组
  • 结构体
  • 共用体
  • 枚举类型.

1) 数组

概念:为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组 知识点: 数组的开始下标都是从0开始的. 我们需要记录一些数据类型相同的数据, 比如记录一个班每个学生的总成绩, 我们可以为每个学生创建一个变量,然后将总成绩赋值,但是这样太麻烦,代码也特别长,  这个时候就需要用到数组来记录. C语言常用的数组: 1. 整型数组:一系列的整数集合.

//定义一个长度为10的整型数组.
int a[10];
//定义一个长度为10的整型数组,并初始化.
int a[10]  = {100, 98, 99, 60, 79, 45 ,9 ,68 ,79, 80};
int a[] = {100, 98, 99, 60, 79, 45 ,9 ,68 ,79, 80};

根据上面的例子可以发现: 数组定义的方式: 和定义普通的数据类型很相似, 但是数组后加上了一个[]并在里面写明了数组的长度. 数组的初始化: 初始化数据在一对花括号中,并用逗号隔开,但是如果我们不想计算有多少个元素,可以省略中括号中数组的长度,编译器会根据我们后面花括号中的内容自动计算数组的长度. 如果只是定义数组而不写后面的初始化,一定要记得不能省略中括号中的数组长度. 数组的访问:   通过中括号加上下标来访问的.

printf("%d\n", a[0]);  //输出第0个元素
a[3] = 99;  //将第4个元素 改为99.

  2. 浮点数数组: 一系列的浮点数的集合.

//定义一个长度为10的浮点数数组.
double a[10];
//定义一个长度为10的浮点数数组并初始化.
double a[10] = {100, 98.62, 99.13, 60.5, 79.3, 45.1 ,9.2123, 68.23 ,79.1, 80.9};
double a[] = {100, 98.62, 99.13, 60.5, 79.3, 45.1 ,9.2123, 68.23 ,79.1, 80.9};
double a[10] = {1.2, 3.5};

根据上面的写法我们发现, 如果我们定义了一个长度为10的数组,但是我们不在花括号中写满十个数字,那么编译器会将我们写的赋值给数组的前面几个,而后面的数组元素全部赋0,

//相当于
double a[10] = {1.2, 3.5, 0, 0, 0, 0, 0, 0, 0,  0 };

那么我们可以断定 int a[10] = {}; 那么a[10]中全部都是0, 那么如果只是定义一些 int a[10]; 呢?我们可以来测试一下.

#include <stdio.h>

int main(){
    int i, a[10]={}, b[10];
    printf("int a[10] = {};的输出: ");
    for (i = 0; i < 10; i++){
        printf("%d ", a[i]);
    }
    printf("\n");
    printf("int b[10];的输出: ");
    for (i = 0; i < 10; i++){
        printf("%d ", b[i]);
    }
    printf("\n");
    return 0;
}

我们看看输出: 我们会发现,如果是直接定义int a[10]; 的其实是系统随机的值. 知道了这个我们通常会发现一些C语言的数组代码这样写:

int a[100] = {0};

这个其实就是初始化一个a[100]的数组,并将里面的值全部赋值为0.在花括号中写个0是使得代码更加易懂. 3.字符数组: 定义一个字符型数组.

//定义一个长度为5的字符数组
char s[5];
//定义一个长度为5的字符数组, 并初始化.
char s[5] = {'a', 'b', 'c', 'd', 'e'}
char s[] = {'a', 'b', 'c', 'd', 'e'}
char s[5] = "abcd";
char s[] = "abcd";

这个时候会发现为什么长度为5的字符数组用双引号里面只放四个字母,而单引号放五个. 字符串: 相当于一串字符,用来表示一些语句子类的,其实也就是另类的字符数组.

char c[] =  "I Love C!"; //字符串
char c1[] = {'I', ' ', 'L', 'o', 'v', 'e', ' ', 'C', '!'}; //字符数组

这样应该比较清楚为什么会有字符串了. 便于理解! 虽然这两个都表示同样的一句话, 但是其实是有差别的, 第一个长度是10, 第二个长度是9. 原因就在于字符串的结尾有个\0的结束符号,代表这个字符串结束了.那么为什么要这样做呢? 我们举个例子:

#include <stdio.h>

int main(){
    char s[20]; //字符数组
    char s1[20] = "I Love C!"; //字符串

    //模拟我们一个一个输入:
    s[0] = 'I';
    s[1] = ' ';
    s[2] = 'L';
    s[3] = 'o';
    s[4] = 'v';
    s[5] = 'e';
    s[6] = ' ';
    s[7] = 'C';
    s[8] = '!';
    printf("字符数组: %s\n", s); //%s字符串标准输出
    printf("字符串: %s\n", s1);
    return 0;
}

看看输出结果:     有没有发现,字符数组后面多了一个很奇怪的符号? 这个并不是意外,还记得我们上面说的,如果只是定义数组,系统会自动随机给数字给数组,如果没有’\0’作为结束符号,那么系统就会一直输出到出现’\0’为止.字符串输出的后面就会出现一些奇怪的符号,在windows中最常见的就是一堆”烫烫烫”. ‘\0’就是ascii码中的0.可以修改上述代码,char s[20]={0}然后试试.绝对不会出现刚刚那样的错误. 多维数组: 之前我们使用的都是一维数组, C语言提供了多维数组的使用,虽然用的情况可能不多, 但是还是需要了解一些. 假设还是一个班的学生, 我们在教室, 教室有10排, 12列, 在玩一个游戏, 要记录分, 我们可以这样记录, 第三排第五列的学生成绩为89分. 第10排第11列的学生成绩为100分. 那么我们可以使用二维数组这样定义:

int Stu[10][12] = {0};  //定义一个10排12列的教室, 将所有学生的初始成绩为0
Stu[2][4] = 89; //第三排第五列的学生成绩为89.数组都是以0开始的.
Stu[9][10] = 100; //第10排第11列的学生成绩为100. 
//但是这样会不会很不方便去理解 , 其实只要用多了你眼中这些就不会太难理解.
//也可以换个好理解的方式来定义, 但是这样浪费内存.不建议使用.
int Stu[11][13] = {0}; //定义教室, 我们不用第0排, 第0列.
Stu[3][5] = 89; //第三排第五列的学生成绩为89.数组都是以0开始的.
Stu[10][11] = 100; //第10排第11列的学生成绩为100. 

二维数组就是这样,那么三维也是同理.使用的情况即更少了.

2) 结构体

结构体: 把不同类型的数据组合成一个整体 我们想要记录一个班所有学生的成绩,为了不定义所有学生的变量,我们使用数组,但是我们当然希望记录学生的姓名,各个科目的成绩.

struct Student{
    int id; //学号
    char name[20]; //姓名
    float Math; //数学成绩
    float Chinese; //语文成绩
    float Engish; //英语成绩
};

结构体的一般用法:

 struct Student A;  //定义一个学生A
    //模拟输入
    A.id = 1;
    A.name[0] = 'T';    //如果是输入, 可以直接输入字符串.
    A.name[1] = 'o';
    A.name[2] = 'm';
    A.name[3] = '\0';
    A.Math = 99.9;
    A.Chinese = 100;
    A.Engish = 100;

在C语言我们可以选择用结构体去存储这样一个学生的信息.但是我们要存储多个学生呢? 应该知道的, 结构体数组. 定义方法:

struct Student Stu[50];  //定义50个学生的数组
//还有一种是直接在结构体定义时候初始化.  就像int a = 10;
struct Student{
    int id; //学号
    char name[20]; //姓名
    float Math; //数学成绩
    float Chinese; //语文成绩
    float Engish; //英语成绩
}Stu[50]; //初始化50个学生的数组

对于结构体数组的用法和普通用法数组用法也一样.

Stu[0].id = 1001;   //将0号学生的学号改为1001
printf("%s\n", Stu[10].name);  //输出10号学生的姓名

3) 共用体

几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构 共用体在写法上和结构体很相似.

union data{
    int i;
    char ch;
    double d;
};

但是共用体相当于这三个变量共用一段地址, 我们创建变量 union data a; 那么这个a占用多少字节呢? 就是union data中字节最多 double d, 所以这个union占用了8个字节. int 为四个字节, 如果我们访问 a.i, 就会去内存中取前(或者后, 不同编译器)4个字节, 同理访问a.ch 就会去内存中去前1个字节, 如果访问a.d就会8个字节全部取出. 举个栗子:

#include <stdio.h>

union data{
    int i;
    char ch;
    short s;
};

int main(){
    union data a;
    a.i = 97;
    printf("a.i = %d, a.ch = %c, a.s=%hd\n", a.i, a.ch, a.s);
    //因为int 占4个字节 范围 -2147483648 ~ 2147483647
    //char 占1个字节 范围 -128 ~ 127
    //short 占2个字节 范围 -32768 ~ 32767
    a.i = 128;
    printf("a.i = %d, a.ch = %c, a.s=%hd\n", a.i, a.ch, a.s);
    a.i = 32768;
    printf("a.i = %d, a.ch = %c, a.s=%hd\n", a.i, a.ch, a.s);

    return 0;
}


//输出结果:
a.i = 97, a.ch = a, a.s=97
a.i = 128, a.ch = �, a.s=128
a.i = 32768, a.ch = , a.s=-32768

4) 枚举类型

如果一个变量只有几种可能的值,则可以定义为“枚举类型”. 比如限定几种颜色, 星期一到星期天. 都可以使用枚举类型来表示. 定义

enum Color{red,yellow,blue,green};

用法:

#include <stdio.h>

enum Color{red,yellow,blue,green};

int main(){
    enum Color c;
    c = red;
    if (c == red){
        printf("红色\n");
    }
    return 0;
}

输出就是红色. 枚举类型可以让我们更加直观的感受到这个颜色就是一种类型. 但其实每个颜色都代表着一个数字,所以我们用==判断就是比较数字.我们可以将if(c== red) 改为if(c == 0) 结果也是一样的. 当然枚举类型还能自己给每个枚举元素赋一个代表它的整数.

#include <stdio.h>

enum Color{red=2,yellow,blue,green};

int main(){
    printf("%d %d %d %d\n", red, yellow , blue, green);
    return 0;
}

输出结果:

2 3 4 5

如果我们再改动blue = 7, 结果

2 3 7 8

更加可怕的是, 我们可以将enum的多个元素设置为一个值:

#include <stdio.h>
enum Color{red=2,RED=2, yellow,blue,green}; 
int main(){
    enum Color c = red;
    if(c == RED){
        printf("红色!\n");
    }
    return 0; 
}
  • c语言
  • C语言

扫一扫,分享到微信

微信分享二维码
C语言_04 三种程序结构 顺序, 选择(分支), 循环结构
C语言02_基本数据类型
  1. 1. C语言构造类型:
    1. 1.1. 1. C语言中构造类型分为以下四种:
      1. 1.1.1. 1) 数组
      2. 1.1.2. 2) 结构体
      3. 1.1.3. 3) 共用体
      4. 1.1.4. 4) 枚举类型
Like Issue Page
No Comment Yet
Login with GitHub
Styling with Markdown is supported
Powered by Gitment
© 2023 Pan yiwen
本站访客数人次
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链
  • 关于我

tag:

  • c语言
  • 算法
  • 协议
  • ajax
  • jsp
  • 九大内置对象
  • java并发
  • json
  • 回溯
  • 随笔
  • 面试题
  • tomcat

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 浅析tomcat原理

    2023-07-24

    #tomcat

  • java-AbstractQueuedSynchronizer(AQS)

    2018-11-17

    #java并发

  • 商汤java实习生面试题

    2018-09-09

    #面试题

  • servlet中destory方法的误解

    2018-07-09

    #随笔

  • ubuntu16.04科学上网

    2018-07-08

    #随笔

  • http简史-互联网浪潮中的重要角色

    2018-07-05

    #协议

  • n皇后

    2018-07-02

    #算法#回溯

  • wordpress使用 Font Awesome 图标在 Firefox 中不显示问题

    2018-06-26

  • 堆排序

    2018-05-26

    #算法

  • C语言_07 内存

    2018-03-20

    #c语言

  • C语言_06 指针

    2018-03-19

    #c语言

  • C语言_05 函数详解

    2018-02-11

    #c语言

  • C语言_04 三种程序结构 顺序, 选择(分支), 循环结构

    2018-02-06

    #c语言

  • C语言03_构造类型 数组, 结构体, 共用体, 枚举类型介绍

    2018-02-04

    #c语言

  • C语言02_基本数据类型

    2018-02-04

    #c语言

  • C语言01_介绍+helloworld

    2018-02-02

    #c语言

  • 笔记:jsp的九大内置对象和四大作用域

    2018-01-29

    #jsp#九大内置对象

  • 互联网协议-简单理解和介绍

    2018-01-27

    #协议

  • 笔记: AJAX

    2018-01-25

    #ajax

  • JavaScript笔记: JSON

    2018-01-25

    #json

  • Goodbye 2017

    2017-12-30

  • 我的blog
  • 我的github
Hello World!
2018