没有什么比时间更具有说服力了, 因为时间是无需通知我们就可以改变一切. --余华<活着>
目录
3. 常量变量
3.1 常量
3.1.1 字面常量
例如: 3.14
3.1.2 const定义的常量
(1) C语言中, const修饰的只读变量具有不可改变性, 这个变量具有常属性, 并且它任然占用内存空间;
(2) 在C++语言中, const修饰的标识符就是常量;
(3) 例如: const float pai = 3.14f;
3.1.3 #define定义的标识符常量 (宏)
#define MAX 100;
3.1.4 枚举常量 (enumeration)
enum {Name, Male, Female};
3.2 变量
3.2.1 变量的命名规则
必须以字母或者下划线开头, 后面可以跟若干个字母, 数字, 下划线, 但不能有其他字符.
3.2.2 变量的分类
(1) 全局变量: 变量出现在所有代码块之外;
(2) 局部变量: 变量出现在局部范围内;
(3) static
- 修饰全局变量: 变为静态全局变量, 改变了变量的链接属性, 存储在内存中的静态区, 在声明它的文件之外是不可见得的, 仅在当前源文件可见;
- 修饰局部变量: 其生命周期延长, 由原来的栈中存放改为静态存储区, 作用域仍为局部作用域.
3.2.3 变量的初始化和赋值
初始化: 创建变量的同时, 给变量赋初值, 开辟空间默认的值就是初始化的值.
赋值: 开辟空间刚开始的随机值.
3.2.4 变量在内存中的存储位置
内核空间 (高地址)
用户不能读写.
栈区 (向下增长)
(1) 编译器自动分配内存并释放, 栈区主要存放运行函数而分配的局部变量, 函数参数, 返回数据, 返回地址等;
(2) 在Windoiws下, 由编译器决定栈的大小 (一般为1M/-2M), 如果申请的空间超过栈的剩余空间时, 将提示overflow, 因此能从栈获得的空间较小, 但其运行速率比堆快.
内存映射段
文件映射, 动态库, 匿名映射;
堆区 (向上增长)
(1) 动态开辟内存, malloc, calloc, realloc, free;
(2) 堆的大小受限于计算机系统中有效的虚拟内存, 堆获得的内存空间比较灵活,也比较大;
(3) 一般由程序员分配释放, 若程序员不释放, 程序结束时可能由OS回收, 分配方式类似于链表.
全局区(数据段, 静态区)
存放全局变量, 静态数据, 程序结束后由系统释放.
程序代码区 (代码段)
存放函数体(类成员函数和全局函数)的二进制代码, 可执行的代码/只读常量.
3.2.5 变量的作用域和生命周期
#define _CRT_SECURE_NO_WARNINGS_
#include <stdio.h>
#include <stdlib.h>
int a = 10; // 全局变量
int mian(){
int num1 = 0; // 局部变量
int num2 = 0; // 局部变量
printf("请输入两个整数: ");
scanf("%d %d,&num1, &num2");
int result = num1 + num2;
printf("result=%d\n",result);
system("pause");
return 0;
}
区别: 1.对于局部变量来说, 作用域为当前代码块, 生变周期也是当前代码块;
2.对于全局变量来说, 作用域为整个工程, 生命周期是整个程序的运行过程.
作用域
通常来说, 一段代码中所用到的名字并不总是有效, 可用的, 而是限定这个名字的可用性的代码范围就是这个名字的作用域.
- 局部变量: 就是变量所在的作用域;
- 全局变量: 整个工程.
生命周期
指变量的创建到变量的销毁之间的一个时间段.
- 局部变量: 进入作用域生命周期开始, 出作用域生命周期结束.
- 全局变量: 整个程序的生命周期.
3.3 字符串+转义字符+注释
3.3.1 字符串
这种由双引号 (Double Quote) 引起来的一串字符称为字符串字面值 (String Literal) , 或者简称字符串, 字符串的结束标志是一个 \0 转义字符.
3.3.2 转义字符
(1) \? 在书写连续多个问号时使用, 防止他们被解析成三字母词;
(2) \' 用于表示字符串常量;
(3) \''用于表示一个字符串内部的双引号;
(4) \\ 用于表示一个反斜杠, 防止它被解析成一个转义序列符;
(5) \a 警告字符, 蜂鸣;
(6) \b 退格符;
(7) \f 进纸符;
(8) \n 换行;
(9) \r 回车;
(10) \t 水平制表符;
(11) \v 垂直制表符;
(12) \ddd ddd表示一个1-3个八进制的数字, 例如: \130X;
(13) \xddd ddd表示一个1-3个十六进制数字, 例如: \x036;
#include <stdio.h>
#include <string.h>
int main(){
printf("%d\n",strlen("abcdef")); // 求字符串长度
printf("%d\n",("c:\test\328\test.c")); // \32被解析成一个转义字符
printf("My name is \"Yangjie\""); // \"YangJie\" YangJie
system(pause);
return 0;
}
3.3.3 注释
- 注释的作用
(1) 代码中不需要的部分可以删除, 也可以注释掉;
(2) 代码中的有些代码比较难懂, 可以加一些注释, 方便理解; - 注释的基本使用
VS多行代码注释: ctrl + k ctrl + c 取消注释 ctrl + k ctrl + u;
(1) /* ... */
(2) // ...
(3) #if 0(1)
#endif