您的位置:首页 > 编程语言 > C语言/C++

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

2018-02-05 02:18 525 查看

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;
}
 

查看原文:http://www.welcom212.com/wordpress/?p=174
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: