C语言入门系列 - 共用体union,枚举enum,宏定义#define,条件编译,const与指针
第一节 C 语言基础以及基本数据类型
第二节 C 语言运算符
第三节 C 语言控制语句
第四节 C 语言自定义函数
第五节 C 语言修饰变量的关键字
第六节 C 语言构造数据类型–数组
第七节 C 语言字符串
第八节 C 语言指针
第九节 指针与函数、指针函数、函数指针
第十节 数组与指针、二级指针&NULL&void 指针
第十一节 结构体
第十二节 链表
第十三节 共用体union,枚举enum,宏定义#define,条件编译,const与指针
C语言–图书管理项目
一、共用体
共用一块内存空间
共用体也是一种自定义数据,先定义这种数据类型。
union 共用体名字
{
成员类型 成员名;
成员类型 成员名;
}
union Data
{
char ch;
int a;
};
共用体的类型:union Data
定义共用体变量: union Data d1;
使用通过点语法:d1.a = 10; d1.ch = ‘a’;
共用体所占空间大小:占用空间最大的成员的类型所占字节数。
小端模式:数据的高字节,存放在高地址中。计算机读取数据的方向,是从高地址开始读取的;
大端模式:数据的高字节,存放在低地址中。计算机读取数据的方向,是从低地址开始读取的;
大小端判断代码
#include<stdio.h>
union Data
{
char ch;
int a;
};
int main()
{
union Data d1;
// 看成员在内存里面的位置
printf("%p %p\n",&d1.a,&d1.ch);
printf("%d",sizeof(d1));
d1.a = 0x12345678; //在字节中是12这边高字节,向右逐渐变低。即78为低字节
//高字节为:0x12 低字节为:0x78
if(d1.ch == 0x78)
{
printf("小端"); //低地址放低字节,存放的是78563412。所以第一个字节是78的话就是低地址存放高字节
}
else
{
printf("大端"); //低地址放高字节,存放的是12345678。所以第一个字节是78的话就是低地址存放高字节
}
return 0;
}
二、枚举
增加代码的可读性
枚举也是一种数据,自定义的数据类型
将所有的可能结果罗列数来使用标识符代替
代码如下(示例):
#include<stdio.h>
// enum week{MON=1,TUS,WED,THIR=5,FRI,SAT,SUN};
enum light{RED,GREEN,YELLOW};
int main()
{
// printf("%d %d %d %d %d %d %d",MON,TUS,WED,THIR,FRI,SAT,SUN); // 0 1 2
// 用户输入 -- 0--红灯 1--绿灯 2--黄灯
// 枚举类型声明变量
enum light led;
printf("请输入当前的交通灯的颜色:0-红灯 -- 1-绿灯 -- 2代表黄灯");
scanf("%d",&led);
switch(led)
{
case RED:
// ARR<< 3 | xx;
printf("红灯");
break;
case GREEN:
// ARR<< 2 | xx;
printf("绿灯");
break;
case YELLOW:
// ARR<< 1 | xx;
printf("黄灯");
break;
}
return 0;
}
三、宏定义
#define 标识符 表达式
#define PI 3.14
宏定义和变量区别
宏定义是在预处理的时候进行替换,不会做运算,不需要开空间
变量定义是在程序运行时开空间
代码如下(示例):
#include<stdio.h>
#define PI 3.14
#define ADD 3 + 2
#define ADD1 (3+2)
#define MAX(a,b) (a > b ? a : b)
int main()
{
printf("%f\n",PI);
printf("%d\n",3*ADD); // 3 * 3 + 2
printf("%d\n",3*ADD1); // 3 *(3+2)
printf("%d\n",MAX(3,10)); // 3 > 10 ? 3 : 10
return 0;
}
为了防止某个头文件的重复包含可以定义一个宏名 用于标识当前这个文件是否已经被项目中的其他文件引入
led.h
#ifndef __LED_H
#define __LED_H
#include<led.h>
#endif
四、条件编译
条件编译
#ifdef 宏名 //有宏定义这个宏名,则执行代码段1
代码段1
#else //非则执行代码段2
代码段 2
#endif
代码如下(示例):
include<stdio.h>
#define v1
//#define v2
int main()
{
#ifdef v1
printf("界面1\n");
#else
printf("界面2\n");
#endif
printf("支付功能\n");
return 0;
}
五、const 和指针
const 常量 ---- 常量区
const int n = 5; // 常量在进行定义的是必须要给值
const 可以修饰指针指向的空间。
const 指向对象的数据类型 *指针名;
指针指向的空间是只读的,不能通过 *p 进行修
不可以修改空间内容,但可以改变指向
const int n = 5;
const int *p = &n; //修饰指针指向的空间
//*p = 10; //不可以修改空间内容,会报错
const int a = 9;
p = &a; //但可以修改指针指向
printf("%d",*p);
const 修饰指针本身的空间。
指向对象的数据类型 *const 指针名;
int n = 10;
int *const p = &n
int n = 10;
int m = 20;
int *const p = &n; //修饰指针本身的空间
printf("%d",*p);
*p = 25;
printf("%d",*p);
//p = &m; //报错,指针不可以改变指向
const 指向对象类型 * p;
指针指向对象是只读的, * p 是只读的。
指向对象类型 * const p;
指针空间是只读的,p 是只读
const 指向对象类型 * const p; p 和*p 都是只读的
总结
C语言总体知识点大概完成了,接下来会借着图书馆里项目操作下文件的保存以及初始化。
d1.a = 0x12345678; //在字节中是12这边高字节,向右逐渐变低。即78为低字节
if(d1.ch == 0x78)
{
printf(“小端”); //低地址放低字节,存放的是78563412。所以第一个字节是78的话就是低地址存放高字节
}