目录

  • 枚举
  • 结构体
  • 共用体

枚举

enum

enum枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。

枚举语法定义格式为:

enum 枚举名 {枚举元素1,枚举元素2,……};

  

枚举类型的定义

第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。也可以手动指定每个枚举成员的值。

示例:

#include <stdio.h>
//定义枚举类型WEEKDAY
enum WEEKDAY{
MON=1, TUE, WED, THU, FRI, SAT, SUN
}; int main ()
{
return 0;
}

枚举变量的定义

枚举变量的定义有三种方式:

1、先定义枚举类型,再定义枚举变量

enum WEEKDAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum WEEKDAY day;

  

2、定义枚举类型的同时定义枚举变量

enum WEEKDAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

  

3、省略枚举名称,直接定义枚举变量

enum
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

  

使用枚举变量示例代码:

#include <stdio.h>

int main ()
{
//定义枚举类型WEEKDAY
enum WEEKDAY{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
//定义枚举变量day
enum WEEKDAY day;
day=WED;
printf("%d\n",day);
return 0;
}

  

在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的。

示例代码,编译报错:

#include <stdio.h>

int main ()
{
//定义枚举类型WEEKDAY
enum WEEKDAY{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
//定义枚举变量day
enum WEEKDAY day;
// 遍历枚举元素
for (day = MON; day <= SUN; day++) {
printf("枚举元素:%d \n", day);
}
return 0;
}

  

结构体

概念

结构体支持用户自定义和存储可用数据类型的数据集合。

类似数组,但是数组只能存储相同类型的数据。

结构体的定义

语法格式:

struct tag {
member-list
member-list
member-list
...
} variable-list ;

tag 是结构体标签。

member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。

variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。

例如:定义一个学生信息结构体

#include <stdio.h>

//学生信息结构体
struct Student{
int id;//学号
char name[20];//姓名
int age;//年龄
char gender[2];//性别
char classes[20];//班级
}; int main ()
{
return 0;
}

  

结构体变量的定义和访问

为了访问结构的成员,我们使用成员访问运算符(.)。

示例代码:

#include <stdio.h>
#include <string.h> //学生信息结构体
struct Student{
int id;//学号
char name[20];//姓名
int age;//年龄
char gender[2];//性别
char classes[20];//班级
}; #include <stdio.h> int main( )
{
struct Student zs; /* 声明 zs,类型为 Student */
struct Student ls; /* 声明 ls,类型为 Student */ /* zs 初始化 */
zs.id=2016001;
strcpy( zs.name, "张三");
zs.age=21;
strcpy( zs.gender, "男");
strcpy( zs.classes, "软件工程1班"); /* ls 初始化 */
//ls.id=2016002;
//ls.name="李四";//错误:cannot convert from 'char [5]' to 'char [20]'
//ls.age=21;
//ls.gender="女";//错误:cannot convert from 'char [3]' to 'char [2]'
//ls.classes="软件工程1班";//错误:cannot convert from 'char [12]' to 'char [20]'
ls.id=2016002;
strcpy( ls.name, "李四");
ls.age=21;
strcpy( ls.gender, "女");
strcpy( ls.classes, "软件工程1班"); /* 输出 zs信息 */
printf( "学号: %d\n", zs.id);
printf( "姓名: %s\n", zs.name);
printf( "年龄: %d\n", zs.age);
printf( "性别: %s\n", zs.gender);
printf( "班级: %s\n",zs.classes); /* 输出 ls 信息 */
printf( "学号: %d\n", ls.id);
printf( "姓名: %s\n", ls.name);
printf( "年龄: %d\n", ls.age);
printf( "性别: %s\n", ls.gender);
printf( "班级: %s\n",ls.classes); return 0;
}

  

  

备注:strcpy把含有'\0'结束符的字符串复制到数组中,会逐个字符进行拷贝。“=”赋值必须保证字符串长度和字符数组长度一致,否则将会导致转换错误。

字符串和数组长度定义的关系:c语言中的字符串是使用字符数组存储的,含有'\0'作为结束符号。因此定义数组长度的时候需要考虑'\0'元素,例如:

char arr[4]="abc";

  

输出效果:

结构体数组

可以使用结构体数组来存储结构体,方便数据的操作。

示例代码:

#include <stdio.h>
#include <string.h> //学生信息结构体
struct Student{
int id;//学号
char name[20];//姓名
int age;//年龄
char gender[2];//性别
char classes[20];//班级
}; #include <stdio.h> int main( )
{
struct Student stus[3];//定义结构体数组 struct Student zs; /* 声明 zs,类型为 Student */
struct Student ls; /* 声明 ls,类型为 Student */
struct Student ww; /* 声明 ww,类型为 Student */ /* zs 初始化 */
zs.id=2016001;
strcpy( zs.name, "张三");
zs.age=21;
strcpy( zs.gender, "男");
strcpy( zs.classes, "软件工程1班"); /* ls 初始化 */
ls.id=2016002;
strcpy( ls.name, "李四");
ls.age=18;
strcpy( ls.gender, "女");
strcpy( ls.classes, "软件工程2班"); /* ww 初始化 */
ww.id=2016048;
strcpy( ww.name, "王五");
ww.age=23;
strcpy( ww.gender, "男");
strcpy( ww.classes, "软件工程3班"); //结构体数组初始化
stus[0]=zs;
stus[1]=ls;
stus[2]=ww; for(int i=0;i<3;i++){
/* 输出学生列表信息 */
printf( "学号: %d\t姓名: %s\t班级: %s\n", stus[i].id,stus[i].name,stus[i].classes);
} return 0;
}

  

输出:

共用体

共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。如何实现?

定义共用体

语法格式:

union [union tag]
{
member definition;
member definition;
...
member definition;
} [one or more union variables];

  

例如:

union Data
{
int i;
float f;
char str[20];
} data;

  

说明:

  1. Data 类型的变量可以存储一个整数、一个浮点数,或者一个字符串。即着一个变量 data(相同的内存位置)可以存储多个多种类型的数据。
  2. 支持在一个共用体内使用任何内置的或者用户自定义的数据类型。
  3. 共用体占用的内存应足够存储共用体中最大的成员。例如,在上面的实例中,Data 将占用 20 个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的。可以使用sizeof()检测。

例如:

#include <stdio.h>
#include <string.h> union Data
{
int i;
float f;
char str[20];
}; int main( )
{
union Data data; printf( "Memory size occupied by data : %d\n", sizeof(data)); return 0;
}

  

共用体访问

使用成员访问运算符(.)

示例1:共用体的错误用法

#include <stdio.h>
#include <string.h> union Data
{
int i;
float f;
char str[20];
}; int main( )
{
union Data data; data.i = 10;
data.f = 220.5;
strcpy( data.str, "abcdabcd"); printf( "data.i : %d\n", data.i);
printf( "data.f : %f\n", data.f);
printf( "data.str : %s\n", data.str); return 0;
}

  

共用体data存放数据的顺序不同,导致i和f输出信息错误,而最后输入的str值则正确。说明了i,f,str共用一段长度为20个字节的内容。

示例2:共用体的正确用法

#include <stdio.h>
#include <string.h> union Data
{
int i;
float f;
char str[20];
}; int main( )
{
union Data data; data.i = 10;
printf( "data.i : %d\n", data.i); data.f = 220.5;
printf( "data.f : %f\n", data.f); strcpy( data.str, "C Programming");
printf( "data.str : %s\n", data.str); return 0;
}

  

正确用法是依次访问某种类型的数据。确保在同一时间只使用一个变量,这也是union数据类型定义的目的。

C10 C语言数据结构的更多相关文章

  1. 读谭浩强C语言数据结构有感(1)

    1.什么是数据结构? 数据结构,就是我们计算机内部的运算,编程语言的基础工作模式吧,个人总结的 = = !! 数据:说简单一点,就是计算机二进制机器码,然后通过一些复杂的操作,变为复杂的语言. 数据元 ...

  2. C语言数据结构----栈与递归

    本节主要说程序中的栈函数栈的关系以及栈和递归算法的关系. 一.函数调用时的栈 1.程序调用时的栈是也就是平时所说的函数栈是数据结构的一种应用,函数调用栈一般是从搞地质向低地址增长的,栈顶为内存的低地址 ...

  3. 第二章 R语言数据结构

    R语言存储数据的结构包括:标量.向量.矩阵.数组.数据框和列表:可以处理的数据类型包括:数值型.字符型.逻辑型.复数型和原生型. 数据结构 向量 向量是用来存储数值型.字符型或逻辑型数据的一维数组.单 ...

  4. C语言---数据结构(内建,数组,自定义)

    数组是一组有序数据的集合,每个元素都属于同一个数据类型. 一维数组的定义: 类型符  数组名[常量表达式] 常量表达式中,可以包括常量和符号常量,int a[3+5]是合法的.但是不能包含int a[ ...

  5. C语言数据结构之二叉树的实现

    本篇博文是博主在学习C语言算法与数据结构的一些应用代码实例,给出了以二叉链表的形式实现二叉树的相关操作.如创建,遍历(先序,中序后序遍历),求树的深度,树的叶子节点数,左右兄弟,父节点. 代码清单如下 ...

  6. [C语言] 数据结构-预备知识指针

    所有的伟大源于一个勇敢的开始 数据结构预备知识 指针 1.指针:是C语言的灵魂,指针=地址 地址:内存单元的编号 指针变量:存放内存单元地址的变量 int *p;//p是指针变量,int *表示该p变 ...

  7. [C语言] 数据结构-衡量算法的标准

    1.衡量算法的标准 算法 解题的方法和步骤 衡量算法的标准 1.时间复杂度 大概程序要执行的次数,而非执行的时间,不同的机器运行时间肯定不一样. 2.空间复杂度 算法执行过程中大概所占用的最大内存 3 ...

  8. C语言数据结构与算法之深度、广度优先搜索

    一.深度优先搜索(Depth-First-Search 简称:DFS) 1.1 遍历过程: (1)从图中某个顶点v出发,访问v. (2)找出刚才第一个被顶点访问的邻接点.访问该顶点.以这个顶点为新的顶 ...

  9. C语言数据结构-栈

    一.栈的定义 栈(statck)这种数据结构在计算机中是相当出名的.栈中的数据是先进后出的(First In Last Out, FILO).栈只有一个出口,允许新增元素(只能在栈顶上增加). 移出元 ...

随机推荐

  1. opencv多版本安装

    使用命令查看当前的opencv版本: pkg-config --modversion opencv 自带的是opencv-2.4.9 安装opencv3.1 安装opencv的依赖项 sudo apt ...

  2. RPC00

    https://mp.weixin.qq.com/s?__biz=MjM5ODI5Njc2MA==&mid=2655824821&idx=1&sn=50fa59165aedc8 ...

  3. easyui---panel(面板)

    panel笔记: EASYUI panel: class:easyui-panel,带有title 打开:onclick="javascript:$('#c').panel('open')& ...

  4. [HNOI2017]抛硬币

    Description 小A和小B是一对好朋友,他们经常一起愉快的玩耍.最近小B沉迷于××师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到SSR,让他非常怀疑人生.勤勉的小A为 ...

  5. Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) A

    Arpa is researching the Mexican wave. There are n spectators in the stadium, labeled from 1 to n. Th ...

  6. nodejs 实践:express 最佳实践(七) 改造模块 connect2 解析

    nodejs 实践:express 最佳实践(七) 改造模块 connect2 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的 ...

  7. zk实现服务选举

    非公平选举算法1)首先通过zk创建一个 /server 的PERSISTENT节点 2)多台机器同时创建 /server/leader EPHEMERAL子节点 3)子节点只能创建一个,后创建的会失败 ...

  8. marquee标签(跑马灯)

  9. 浅析HTML的元素类型及其转换

    大家都知道html是由标签元素组成的,在了解元素的类型转换之前,让我们先来了解一下html的元素类型. 一.html元素类型分为两种:块级元素和内联元素,内联元素又被称为行内元素.  常见的块级元素有 ...

  10. Android获取res目录下图片的uri

    Uri.parse("android.resource://" + getApplicationContext().getPackageName() + "/" ...