[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簡介