整型
存储整数的类型,因为操作系统的不同,分配的内存空间大小可能会不相同
类型 | 存储大下 |
---|---|
int | 2或4字节 |
signed int | 2或4字节 |
unsigned int | 2或4字节 |
shot/ signed short/unsigned short | 2字节 |
long/signed long/unsigned short | 4字节 |
浮点类型
类型 | 存储大小 | 范围 | 精度 |
---|---|---|---|
float 单精度 | 4字节 | 1.2E-38到3.4E+38 | 6位小数 |
double双精度 | 8字节 | 2.3E-308到1.7E+308 | 15位小数 |
注:
1.浮点数的存放形式,浮点数=符号位+指数位+尾数位。
2.尾数部分可能丢失,造成精度损失。
字符类型
1.char是1个字符;
2.用单引号括起来;
3.C中允许使用转义字符;
4.在C中,char的本质是一个整数,然后输出时,是ASCII码对应的字符;
5.可以直接给char赋一个整数,然后输出时,会按照对应的ASCII字符输出;
6.char类型是可以进行运算的,相当于一个整数,因为它都应Unicode码。
基本数据类型转换
当C程序在进行赋值或者运算是,精度(范围)小的类型自动转换为精度大的类型
自动转换规则
char/short–>int–>unsigned–>long–>double
float–>double
强制类型转换
将精度高的数据类型转换为精度小的数据类型,使用时加上强制类型转换符(),但可能造成精度降低或一处
格式
(类型名)表达式
注:这种强制类型抓换操作并不改变操作数本身
指针类型(初认识)
int num = 1;
// 1.int*表示的类型为 指针类型
// 2.名称prt是一个int*类型,也是一个变量
// 3.prt指向(保存)一个为int类型的变量的地址
// 4.要想得到某个变量的地址,使用&来取出这个变量的地址
// 5.地址的输出格式为%p
int*prt = #
//指针变量,作为一个变量也有自己的地址
//指针变量的值是一个地址
//获取指针变量保存的地址(值)指向的值,使用*prt
printf("num的地址是%p",&num);
printf("prt的地址是%p,prt存放的值%p, ptr值指向的值%d",&prt,prt,*prt);
最终结果
num的地址是0061FECC
prt的地址是0061FEC8,prt存放的值0061FECC, ptr值指向的值1
num的地址和prt保存的值相同
指针的类型
每一个基本类型对应着自己的指针类型
指向数组指针
指向结构体指针
指向共用体指针
值传递和地址传递
C语言传递参数(或赋值)可以是值传递,也可以传递指针,传递指针也叫地址传递
分类
(1)默认传递值的类型:基本数据类型,结构体,共用体
(2)默认传递地址的类型:指针、数组
值传递:将变量指向的存储内容,在传递或赋值时,拷贝一份给接收变量(浅拷贝)
地址传递或指针传递:如果是指针,就将指针变量存储的地址,传递给接收变量,如果是数组,就将数组的首地址传递给接收变量
常量
- 常量是固定值,在程序执行期间不能更改,固定的值又叫字面量。
- 常量可以是任何的基本数据类型,吐整型、浮点型、字符或字符串等
- 常量的值在定义后不能进行修改
常量的定义
(1)#define 常量名 常量值;#define预处理器。
(2)使用const关键字定义:const 数据类型 常量名 = 常量值
const和define的区别
- const定义的常量带类型,define没有
- const是在编译、运行的时候起作用,而define是在编译的预处理阶段起作用
- define只是简单的的替换,没有类型检查。简单的字符串替换会导致边界效应
- const常量可以进行调试,define不能进行调试,主要是预编译阶段就已经替换了,调试的时候就没了
- const不能重新定义,不可以定义两个一样的,而define通过undef取消某个符号的定义,再重新定义
- define可以配合#ifdef、#ifndef、#endif来使用,可以让代码更灵活,比如我们可以通过#define来启动或者关闭调试信息。
#define A
#define B A+3
#define C A/B * 3
和
#define A
#define B (A+3)
#define C A/B * 3
结果不一样
运算符
- 算术运算符(+、-、、/、%等):a%b = a-a/bb(取模公式)
- 赋值运算符
- 关系运算符
- 逻辑运算符(&&、||、!)
- 位运算符(&、|、^、~)
- 三元运算符(表达式?表达式1:表达式2)