c语言学习笔记(八:struct、union、enum、typedef

自定义数据类型

1.struct

1)结构体的声明

声明结构体变量;结构体所占内存大小是其成员所占内存之和。

struct 结构体类型名{//结构体类型名可省略,匿名结构体    成员表;//可以有多个成员函数;//可以有也可以没有}结构变量量表 [={}];//同时定义多个变量“,”隔开,最后的“;”不能漏。可以在声明的同时初始化。    访问成员的一般形式是:结构变量名 . 成员名 

初始化

对结构体的成员逐个赋值

stu1.num = 18;stu1.score = 90.5;

可以对结构体进行整体赋值

stu2 = (struct Student){"Tom", 15, 88.0};

结构体变量的初始化也可以与定义同时:

struct Student{                 //声明结构体 Student    char name[20];                   int num;                        float score;                 }stu = {"Mike", 15, 91};        //注意初始化值的类型和顺序要与结构体声明时成员的类型和顺序一致

可以部分初始化:

struct Student stu4 = {.name = "Lisa"};1

也可以按照任意的顺序使用指定初始化项目:

    struct Student st = { .name = "Smith",                          .score = 90.5,                          .num = 18 };

2)、结构体变量的存储原理

1)结构体数据成员对齐的意义

……

2)结构体大小的计算方法和步骤

……

3)#pragma pack宏

……

另行了解

3)结构体数组

定义

struct Student{                 //声明结构体 Student    char name[20];    int num;    float score;}stu[5];                        //定义一个结构结构数组stu,共有5个元素

初始化

定义结构数组的同时进行初始化

struct Student stu[2] = {{"Mike", 27, 91},{"Tom", 15, 88.0}};  

整体赋值:

stu[2] = (struct Student){"Jack", 12, 85.0};

结构体变量的成员逐个赋值:

strcpy(stu[3].name, "Smith");stu[3].num = 18;stu[3].score = 90.5;

2.union

声明联合数据类型变量。多个成员共用一块内存。在编译时会选取成员中长度最长的来声明。所有的数据成员具有相同的起始地址。一个union只配置一个足够大的空间来容纳最大长度的数据成员。

union a { //声明了三个成员,但是长度不一(后面sizeof的结果不同机器结果不同,但double肯定是最长的),于是编译器会选取double的长的作为union a的长度    int a1;    // sizeof(int) = 4    float a2;  // sizeof(float) = 8    double a3; // sizeof(double) = 16};

声明与struct相似,替换一下struct声明中的关键字就可了

3.enum

enum变量类型还可以给其中的常量符号赋值,如果不赋值则会从被赋初值的那个常量开始依次加1,如果都没有赋值,他们的值从0开始依次递增1.

声明

enum 枚举类型{枚举成员列表}; //其中的枚举成员列表是以逗号“,”相分隔eg:enum Spectrum{red,balck,yellow,blue,white};

可以用“枚举类型”声明符号名称来表示int型常量。只要是能使用int型的地方就能够使用枚举类型。注意:C语言中的枚举的一些特性不适合C ;比如c中的枚举变量允许使用 运算符,但是c 中则不允许。

enum Spectrum{red,black,yellow,blue,white};                   0    1     2     3     4                        可以在枚举声明中,可以为枚举常量指定整数值:如enum Spectrum{ red=10, black=20, yellow=30,blue=40, white=50 };可在枚举类型成员列表中,声明多个成员的数值(整型常量值)相同, 如:enum Spectrum{ red, black=22, yellow, blue = 22, white };则: red = 0, black = 22, yellow = 23, blue = 22 white = 23.

匿名的enum枚举

enum {FALSE,TRUE};//FALSE 0, TRUE 1

输出12个月的英文单词

#include<stdio.h>#include <stdlib.h>enum Months{jan=1,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec};int main(void)  {  enum Months m;    //flag用来标记输出的个数,若为4个,则输出一个换行符  int flag=0;      //指针数组,存放的是个字符串的入口地址  char *months[]={"January","February","March","April","May","June",        "July","August","September","October","November","December"};  for (m=jan;m<=dec;m  )  {    printf ("%-d月份:%-10s ",m,months[m-1]);    flag  ;    if (flag%4==0)    {      putchar('\n');    }  }  system ("pause");  return 0;  }

4.typedef

用以给数据类型取名

1)与#define的区别

typedef有点像#define宏,其实际类型替代同义字。不同点是typedef在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换。

声明一个指向字符变量的指针和一个字符变量

typedef char* pchar;pchar pa,pb;

简化结构体

struct tagPOINT1 {    int x;    int y;};struct tagPOINT1 p1;typedef struct tagPOINT {    int x;    int y;}POINT;POINT p1;//可以这样;struct tagPOINT p2;//也可以这样;

5.extern

在其中一个c文件中定义一个全局变量key,然后在另一个要使用key这个变量的c文件中使用extern关键字声明一次,说明这个变量为外部变量,是在其他的c文件中定义的全局变量。

  1. extern修饰变量的声明。
  2. extern修饰函数声明。
  3. extern修饰符可用于指示C或者C++函数的调用规范。

(1)main.c文件

#include "common.h"   unsigned char key; int p(void) {     printf("%d\n",i);         return 0;       }

(2)common.c文件

#include "common.h"   extern unsigned char key;int main() {     p();     system("pause");         return 0;      }

来源:https://www.icode9.com/content-4-792151.html

(0)

相关推荐

  • 【C语言笔记】结构体

    我们都知道C语言中变量的类型决定了变量存储占用的空间.当我们要使用一个变量保存年龄时可以将其声明为int类型,当我们要使用一个变量保存某一科目的考试成绩时可以将其声明为float. 那么,当我们要做一 ...

  • C#线程学习笔记八:async & await入门一

    一.涉及内容 async & await是C# 5.0引入的,控制台输出所使用的$符号(拼接字符串)是C# 6.0引入的,其功能类似于string.Format()方法. 二.多线程.异步.同 ...

  • 【Go语言学习笔记一】基础语法

    行分隔行 在 Go 程序中,一行代表一个语句结束.每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾, 但是可以使用分号:结尾,如果当你将多个语句写在同一行时,则必须使用分号: 一.变量 1. ...

  • R语言学习笔记

    R语言学习笔记

  • MyBatis-Plus学习笔记(八) 代码自动生成器

    AutoGenerator 是 MyBatis-Plus 的代码生成器 AutoGenerator 可以快速生成 Entity.Mapper.Mapper XML.Service.Controller ...

  • Rust语言学习笔记(11)

    作者:@zwvista 本文为作者原创,转载请注明出处:https://www.cnblogs.com/zwvista/p/12758683.html 目录 Rust 2015 vs Rust 201 ...

  • R语言学习笔记(四):apply,sapply,lapply,tapply,vapply以及mapply的用法

    apply() apply(m,dimcode,f,fargs) m 是一个矩阵. dimcode是维度编号,取1则为对行应用函数,取2则为对列运用函数. f是函数 fargs是f的可选参数集 > ...

  • 《伤寒论》学习笔记八之表郁轻证。

    最近没顾上更新,今天写一下. 我看了一下上一篇是写到了伤寒兼证.今天继续表郁轻证. 1.太阳病,得之八九日,如疟状,发热恶寒,热多寒少,其人不呕,清便欲自可,一日二三度发.脉微缓者,为欲愈也:脉微而恶 ...

  • 那些年倒腾的R语言学习笔记,全都在这里了~

    今天这一篇整理一下我以往推送过的所有R语言相关文章,一来是方便大家的检索,二来也是阶段性学习的一次总结. 关于内容分类,我分成了学习心得篇.R语言基础.数据可视化.网络数据爬取,然后各自类别进行详细的 ...

  • ​​​​R语言学习笔记(五)——曼哈顿图

    iJournal 学术期刊信息查询 386篇原创内容 Official Account  ↑ ↑  关注iJournal,选刊快人一步  ↑ ↑  iJournal后台回复"2021学科&q ...