1 不同类型
1.1 静态变量
分类:
分为静态全局变量和静态局部变量
作用域:
需要注意静态全局变量也仅仅是在本文件中可用,除非加extern关键字。
内存分配位置
在全局区分配空间,初始值为0。
1.2 局部非静态变量
内存分配位置:
内存分配在栈空间,栈空间初始值为随机值。
作用域:
作用域为当前块(大括号)中
1.3 常量
1.3.1 宏常量
通常定义在文件头部
语法
#define 加常量名加常量值 (不可修改)
1.3.2 const
语法
const 常量类型 常量名 = 常量值; (不可更改)
1.3.3 const和define的区别
编译器处理方式不同:
对于#define, 编译器会在预处理阶段把所有宏替换成所定义的东西, 并不是给其分配内存.
类型和安全检查不同:
#define仅仅作替换, 不会做类型检查. 而const定义的常量有具体的数据类型, 编译阶段也会进行类型检查.
存储方式不同:
#define定义的宏在每次使用的过程中都会进行一次替换, 且每次替换都会重新分配一次内存, const定义的常量会在内存中分配内存.
const节省空间:
如以下例子:
#define PI 3.14159 //常量宏
const doulbe Pi = 3.14159; //此时并未将Pi放入ROM中 ......
double i = Pi; //此时为Pi分配内存,以后不再分配!
double I = PI; //编译期间进行宏替换,分配内存
double j = Pi; //没有内存分配
double J = PI; //再进行宏替换,又一次分配内存!
- const效率更高
- 宏替换只作替换,不做计算,不做表达式求解
2 数据类型
2.1 sizeof关键字
用法
sizeof(数据类型/变量),返回所占字节数。
2.2 实型(浮点型)
2.2.1 float(单精度)
占4字节 7位有效数字 声明float型最好在值后面加f(如float f1 = 3.14f 如果不加, 编译器会默认其是double型, 然后再转换成float)
2.2.2 double(双精度)
占8字节 15-16位有效数字
2.2.3 printf打印
比如在printf中打印实型变量:
%-30.4f
其中“-”表示左对齐, “30”表示至少要有三十个字符的长度,“.4”表示精确度保留小数4位,f表示实型。如果存在“e”表示用科学计数法打印。
2.3 字符型
表示单个字符的变量类型, 一定要用单引号表示一个字符 (如char ch = ‘a’,而不可以为char ch = ‘abc’,也不可以为char ch = “a”)。
2.4 字符串
- C风格字符串 char 变量名[] = "字符串值"
- C++风格字符串 string 变量名 = "字符串值"
2.5 数组
初始化
如果数组未全部初始化,剩下的数默认为0,注意,数组名为常量类型,不可以赋值.
数组名称用途
- 可以获取数组首地址
- 可以统计数组占用内存
- 可以用于数组长度求解, sizeof(数组名) / sizeof(数组名[0])可以算出数组元素个数, 但是要注意, 数组名作为参数传递到另一个函数中的形参时, 会退化为指向数组首地址的指针.
二维数组
初始化可以省略行数(不写行数的前提是不能只有一个声明,比如:int a[][4];,必须直接给数组赋值,比如:int a[][4] = {1, 2, 3, 4, 5, 6, 7, 8},这样默认就是一个a[2][4]),但是不能省略列数