[TOC]
# 变量
~~~
1byte = 8bit 一个字节占8个二进制位
32位机中
char: 1个字节
short: 2个字节
int: 4个字节
long: 4个字节
64位机中
char: 1个字节
short: 2个字节
int: 4个字节
long: 8个字节
~~~
变量定义的一般形式为:数据类型 变量名;
多个类型相同的变量:数据类型 变量名, 变量名, 变量名...;
注意:在定义中不允许连续赋值,如int a=b=c=5;是不合法的。
变量的赋值分为两种方式:1.先声明再赋值 2.声明的同时赋值,例如:
~~~
int a;
a=100;
~~~
## 局部变量和全局变量
变量,按作用域范围可分为两种,即局部变量和全局变量。
局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。在复合语句中也可定义变量,其作用域只在复合语句范围内。
全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序
## 变量存储类别
根据变量的生存周期来划分,可以分为静态存储方式和动态存储方式。
静态存储方式:是指在程序运行期间分配固定的存储空间的方式。静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量。
动态存储方式:是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数;自动变量;函数调用时的现场保护和返回地址等。
C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。
1、用关键字auto定义的变量为自动变量,auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。
2、用static修饰的为静态变量,如果定义在函数内部的,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量
注意:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放;静态局部变量在编译时赋初值,即只赋初值一次;如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。
3、为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明
注意:只有局部自动变量和形式参数可以作为寄存器变量;一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;局部静态变量不能定义为寄存器变量。
4、用extern声明的的变量是外部变量,外部变量的意义是某函数可以调用在该函数之后定义的变量
## 注意
变量如果不初始化,可以编译成功,但是执行的时候,很可能报错.操作系统是如何管理内存的!
每当一个应用程序打开时,操作系统为其分配内存,内存有内存地址与内存单元,当应用程序初始化运行时,会往内存单元里面写数据,当操作系统回收的时候,并不清空内存单元,所以就存在大量的垃圾数据
如果变量不初始化,就会默认读取垃圾数据,有些垃圾数据会导致程序 崩溃
VC++2010编译器可以感知变量没有初始化,调试的时候就会出错
所以,变量使用之前,必须初始化
# 格式化输出
当输出语句中包含普通字符时,可以采用一下格式:
printf("普通字符输出格式符", 输出项);
C语言中的常用格式化符:

`%p 以无符号16进制打印内存地址`
`%x 16进制格式化`
数组名本身就表示地址
如果要输出多个变量的并指定变量的位置时候,格式符还可以连用,变量之间需要用逗号隔开,如:
~~~
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a;
float b;
a=10;
b=7.56;
char x ='c';
printf("整数:%d,小数:%f,字符%c \n",a,b,x);
return 0;
}
~~~
---
putchar输出一个char
~~~
putchar(100); //输出d是ascii码
putchar('a'); //输出a
~~~
# 常量
在程序执行过程中,值不发生改变的量称为常量。C语言的常量可以分为直接常量和符号常量。
直接常量也称为字面量,是可以直接拿来使用,无需说明的量,比如:
整型常量:13、0、-13;
实型常量:13.33、-24.4;
字符常量:‘a’、‘M’
字符串常量:”I love imooc!”
下面的代码分别打印这四种直接常量:
~~~
printf("%d\n", 100); //整形常量
printf("%f\n", 3.14); //实型常量
printf("%c\n", 'A'); //字符型常量
printf("helloworld" ); //字符串型常量
~~~
在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必须先定义,其一般形式为:
` #define 标识符 常量值 `
修改常量,可以只需要修改一次,实现批量修改
` #define 标识符 常量值 `
符号常量的标示符一般习惯使用大写字母,变量的标示符一般习惯使用小写字母,加以区分。下面是一个使用符号常量的小例子:
define也叫定义宏
~~~
#include <stdio.h>
#define PI 3.14
int main(int argc, char const *argv[])
{
printf("圆周率: %f\n", PI);
return 0;
}
~~~
const也可以
~~~
const int a = 1;
int const b = 2;
printf("%d\n", b);
~~~
注意:常量是不可改变的
## 区别
~~~
#define Pai 3.14
const float pai 3.14
~~~
const修饰的本身还是变量,但是不允许修改了
第一种方式: 是将pi定义成一种符号,此时pi只是3.14的别名,在编译期间用3.14去取代pi的值,define相当于替换
第二种方式: 是将pi定义成变量,但告诉编译器它的值是固定不变的,如果试图修改,会报错
define需要修改的时候,只需要修改一次,就可以实现批量修改,效率高而且准确
如果想修改的话只需要
~~~
#define pi 3.14
#define pi 3
~~~
## 字符常量
数字0: 内存中存的是0
`'0'`: 内存中存的是48
`'\0'`: 内存中存的是0
`'\0' == '0'`
---
* 定义:用单引号括起来的单个普通字符或转义字符
* 字符常量的值:该字符的ASCII码值
* 转义字符:反斜线后面跟一个字符或一个代码值表示
| 转义字符 | 含义 |
| --- | --- |
| \n | 换行 |
| \v | 垂直制表 |
| \r | 回车 |
| \a | 响铃 |
| \' | 单引号 |
| \ddd | 3位8进制数代表的字符 |
| \t | 水平制表 |
| \b | 退格 |
| \f | 换页 |
| \\ | 反斜线 |
| \xhh | 2位16进制代表的字符 |
- c语言
- 基础知识
- 变量和常量
- 宏定义和预处理
- 随机数
- register变量
- errno全局变量
- 静态变量
- 类型
- 数组
- 类型转换
- vs中c4996错误
- 数据类型和长度
- 二进制数,八进制数和十六进制数
- 位域
- typedef定义类型
- 函数和编译
- 函数调用惯例
- 函数进栈和出栈
- 函数
- 编译
- sizeof
- main函数接收参数
- 宏函数
- 目标文件和可执行文件有什么
- 强符号和弱符号
- 什么是链接
- 符号
- 强引用和弱引用
- 字符串处理函数
- sscanf
- 查找子字符串
- 字符串指针
- qt
- MFC
- 指针
- 简介
- 指针详解
- 案例
- 指针数组
- 偏移量
- 间接赋值
- 易错点
- 二级指针
- 结构体指针
- 字节对齐
- 函数指针
- 指针例子
- main接收用户输入
- 内存布局
- 内存分区
- 空间开辟和释放
- 堆空间操作字符串
- 内存处理函数
- 内存分页
- 内存模型
- 栈
- 栈溢出攻击
- 内存泄露
- 大小端存储法
- 寄存器
- 结构体
- 共用体
- 枚举
- 文件操作
- 文件到底是什么
- 文件打开和关闭
- 文件的顺序读写
- 文件的随机读写
- 文件复制
- FILE和缓冲区
- 文件大小
- 插入,删除,更改文件内容
- typeid
- 内部链接和外部链接
- 动态库
- 调试器
- 调试的概念
- vs调试
- 多文件编程
- extern关键字
- 头文件规范
- 标准库以及标准头文件
- 头文件只包含一次
- static
- 多线程
- 简介
- 创建线程threads.h
- 创建线程pthread
- gdb
- 简介
- mac使用gdb
- setjump和longjump
- 零拷贝
- gc
- 调试器原理
- c++
- c++简介
- c++对c的扩展
- ::作用域运算符
- 名字控制
- cpp对c的增强
- const
- 变量定义数组
- 尽量以const替换#define
- 引用
- 内联函数
- 函数默认参数
- 函数占位参数
- 函数重载
- extern "C"
- 类和对象
- 类封装
- 构造和析构
- 深浅拷贝
- explicit关键字
- 动态对象创建
- 静态成员
- 对象模型
- this
- 友元
- 单例
- 继承
- 多态
- 运算符重载
- 赋值重载
- 指针运算符(*,->)重载
- 前置和后置++
- 左移<<运算符重载
- 函数调用符重载
- 总结
- bool重载
- 模板
- 简介
- 普通函数和模板函数调用
- 模板的局限性
- 类模板
- 复数的模板类
- 类模板作为参数
- 类模板继承
- 类模板类内和类外实现
- 类模板和友元函数
- 类模板实现数组
- 类型转换
- 异常
- 异常基本语法
- 异常的接口声明
- 异常的栈解旋
- 异常的多态
- 标准异常库
- 自定义异常
- io
- 流的概念和类库结构
- 标准io流
- 标准输入流
- 标准输出流
- 文件读写
- STL
- 简介
- string容器
- vector容器
- deque容器
- stack容器
- queue容器
- list容器
- set/multiset容器
- map/multimap容器
- pair对组
- 深浅拷贝问题
- 使用时机
- 常用算法
- 函数对象
- 谓词
- 内建函数对象
- 函数对象适配器
- 空间适配器
- 常用遍历算法
- 查找算法
- 排序算法
- 拷贝和替换算法
- 算术生成算法
- 集合算法
- gcc
- GDB
- makefile
- visualstudio
- VisualAssistX
- 各种插件
- utf8编码
- 制作安装项目
- 编译模式
- 内存对齐
- 快捷键
- 自动补全
- 查看c++类内存布局
- FFmpeg
- ffmpeg架构
- 命令的基本格式
- 分解与复用
- 处理原始数据
- 录屏和音
- 滤镜
- 水印
- 音视频的拼接与裁剪
- 视频图片转换
- 直播
- ffplay
- 常见问题
- 多媒体文件处理
- ffmpeg代码结构
- 日志系统
- 处理流数据
- linux
- 系统调用
- 常用IO函数
- 文件操作函数
- 文件描述符复制
- 目录相关操作
- 时间相关函数
- 进程
- valgrind
- 进程通信
- 信号
- 信号产生函数
- 信号集
- 信号捕捉
- SIGCHLD信号
- 不可重入函数和可重入函数
- 进程组
- 会话
- 守护进程
- 线程
- 线程属性
- 互斥锁
- 读写锁
- 条件变量
- 信号量
- 网络
- 分层模型
- 协议格式
- TCP协议
- socket
- socket概念
- 网络字节序
- ip地址转换函数
- sockaddr数据结构
- 网络套接字函数
- socket模型创建流程图
- socket函数
- bind函数
- listen函数
- accept函数
- connect函数
- C/S模型-TCP
- 出错处理封装函数
- 多进程并发服务器
- 多线程并发服务器
- 多路I/O复用服务器
- select
- poll
- epoll
- epoll事件
- epoll例子
- epoll反应堆思想
- udp
- socket IPC(本地套接字domain)
- 其他常用函数
- libevent
- libevent简介