上一个篇幅介绍了c语言的一些数据的类型,本文将讲解一些 数据的存储方式和一些位带操作
首先是数据存储的容器——变量。他是存储类型 数据类型 加上变量的名字构成,如 int a;则是定义一个整型变量,a即可存放整型的数据。
存储类型:
auto 自动 由编译器根据定义的位置 自动分配内存位置(定义变量时auto 一般都是省略了的)
register 寄存器类型
extern 引用类型 变量不是在当前位置定义的, 用于引用其他位置(在其他文件中)定义的一个变量
const 常量类型 数据存放的位置 在 内存的常量区|代码段
static 静态类型 数据存放的位置 在 内存的 静态区
在学习中常见到的是const 和 static。
const的用法的: const +变量 表示变量的值不能被改变,一旦改变编译器就会报错。
const+指针 可以用来限制指针的所指向的内存地址不变,但是可以修改该地址所指空间的内容。
const 还可以限制指针所指向的内存不可变但是指针指向的内存地址可以改变。
第一个图const 修饰的是指针变量,b是一个存放地址的空间,他存放的是a变量所在空间的地址,即空间里存放的地址就不能改变了,但是可以通过访问这个地址去改变b所指的空间的内容,即可以访问和改变a的值。
第二个图const修饰的是 b所指向的空间,即变量a的空间,因为b指向a,所以空间里的内容不可以改,即a值不可以改变,
b值可以改变指向其他的空间。
这里部分指针的知识后面再补上。
static 等到后面写变量的生命周期再写吧。
接下来看一下数据的类型转换
为什么要进行数据类型转换呢,因为在变量的赋值,或者赋值运算时需要相同
类型转换方式有两种。
·第一种是隐式类型转换,他是系统在运算时,变量类型不匹配,编译器会自动进行类型转换,默认会从小容器转换为大容器,低精度转换为高精度, 有符号往无符号转换(会报警强制类型转换)
第二种是强制类型转换,这个是编程者的操作,强制进行类型的转换。
他的格式为: (想要转换的数据类型)变量(或者表达式)。
下一个部分是运算符
· 他有很多种类包括:算数运算 + - * / % 求余,关系运算 比较大小关系 > < == >= <= !=,
双目运算:运算的结果 逻辑值 0 假 1 真。逻辑运算 && || ! 逻辑非,位运算: & 按位与 | 按位或 ~ 按位取反 >> 按位左移 << 按位右移 ^ 按位异或 & 按位与。赋值运算符:= 双目运算符 将 = 右边的结果 存放到左边的 变量中。
此外还有些比较特殊的运算符:
第一个是 三目运算符 :?
结构: 表达式1?表达式2:表达式3;
他的逻辑是:若 "表达式1" 为真 则三目运算的结果为 "表达式2",否则 "为表达式3"
第二个为逗号运算符: " , " 他是个双目运算符;
结构: 若表达式1,表达式2,表达式3,...;
他的逻辑为: 依次计算表达式1,表达式2,表达式3,...,表达式N;最后表达式结果为最后一次运算的结果,即表达式N。
sizeof() 运算符 作用: 计算类型或变量对应的类型 占用的内存大小
其运算结果 为 long int 类型
示例 sizeof(int); sizeof(a);
[] 数组取元素运算符
() 优先级提升运算符
函数调用运算符
强制类型转换运算符
& 内存取地址运算符 单目运算
* 地址(指针)访问运算符 单目运算
. 结构体成员访问运算符
-> 结构体(地址)指针成员访问运算符
自增自减运算符: 单目运算 只能与变量结合;
++ -- 在变量前 先+/- 然后再用
++ -- 在变量后 先用 然后再+/-
运算符的优先级 结合与运算的顺序
() 优先级提升运算符 最高
1) 单目运算 后缀++ 后缀 -- ! ~
2) 算数运算
3) 移位运算
4) 关系运算
5) 位运算
6) 逻辑运算
7) 倒数3个 三目运算 赋值运算 ,号运算 。
今天就到这了吧, 后续还会慢慢写嵌入式学习daily系列,欢迎大家一起交流学习。