【比特鹏哥C语言_1.初识C语言】
第一節 第一個C語言項目
C語言是通用計算機編程語言,廣泛用于底層開發。設計目標:提供一種能以簡易的方式編譯、處理低級存儲器產生少量機器碼以及不需要任何運行環境支持的編程語言。
工具→選項→可以調節代碼字體大小
第二節 數據類型
一、常見數據類型
計算機語言→通過寫程序做橋梁→解決生活中的問題
計算機必須有能力描述生活中的問題
舉例:商品價格為45.6元,為小數,在C語言中稱為“浮點數”
年齡為整數,C語言稱為整型
二、printf的輸出格式
| %d | 按整型實際長度輸出(十進制) |
| %md | m為指定的輸出字段的寬度。若數據的位數<m,則左端補空格;若>m,則突破m的限制按實際位數輸出 |
| %ld | 長整型 |
| %u | 無符號十進制輸出整型,長整型%lu;指定字段寬度%mu |
| %o | 無符號八進制輸出整型,長整型%lo;指定字段寬度%mo |
| %x | 無符號十六進制輸出整型,長整型%lx;指定字段寬度%mx |
| %c | 輸出一個字符 |
| %s | 輸出字符串 |
| %ms | 字符串占m列,若數據的位數>m,全部輸出,<m,左補空格(沒有-右對齊) |
| %-ms | (有-左對齊) |
| %m.ns | 輸出占m列,但只取字符串左端n個字符。這n個字符右對齊,左補空格 |
| %-m.ns | 和上面相比,變成左對齊。若n>m,則自動取n值,保證n個字符正常輸出 |
| %f | 單浮點型(對應float)。整數部分全輸出,小數部分輸出6位 |
| %lf | 雙浮點型(對應double) |
| %m.nf(%-m.nf) | 輸出占m列,其中n位小數,右對齊(左對齊) |
| %e | 指數形式輸出 |
三、計算機中的單位:
bit-比特位;byte-字節-8bit;
計算機為什么要搞這么多類型:因為每種類型所占空間不同,選擇合適的類型可以提高空間利用率
第三節 初識常量變量
生活中的一些數據:
一、C語言怎么描述常量和變量:
1.常量:不能改變的量
2. 變量:能被改變的量
二、變量的分類:
1.局部變量 :在main函數的{}內的定義的變量
2.全局變量:在主函數main的{}外定義的變量
當局部變量和全局變量名字沖突的情況下,局部變量優先
不建議全局和局部變量的名字一樣
這個報錯推薦用scanf_s函數,但這個函數是vs編譯提供的,不是C語言標準規定的,所以不推薦用
第四節 變量的作用域和生命周期
一、作用域
變量在哪里起作用,哪里就是它的作用域
局部變量作用域:就是變量所在的局部范圍
全局變量的作用域:整個工程
1. 局部變量作用域舉例
圖一將變量聲明在輸出前面,可以輸出;圖二將變量聲明在變量后面,不可以輸出;圖三、圖四
2. 全局變量作用域舉例
二、生命周期
變量的生命周期:變量的創建和銷毀之間的時間段
局部變量的生命周期:進入局部范圍生命開始,出局部范圍生命結束
全局變量的生命周期:整個程序的生命周期
第五節 常量
一、常量的分類
- 字面常量
- const 修飾的常變量
- #define定義的標識符常量
- 枚舉常量
1.字面常量
//1.字面常量(就是直接常量) //直接常量的書寫形式決定了它的類型 int main() {3.14;//實數型常量10;//整型常量"abcdef";//字符串常量'a';//字符常量return 0; }2.const修飾的常變量
“值”不能變的變量
3.#define定義的標識符常量
4.枚舉常量
可以一 一列舉的常量
第六節 字符串+轉義字符+注釋
一、字符串
字符串是由“雙引號”引起來的一串字符
注:字符串的結束標志是 \0,但字符串的長度并不包括\0 在創建字符數組時尤其要注意
注:只要鼠標點在某一行按Ctrl+C,再按Ctrl+V就會將這一行直接復制在下一行
二、轉義字符
轉義字符:就是轉變了字符原來的意思
1. 常見轉義字符
| " | 用于表示一個字符串內部的雙引號 |
| \ \ | 用于表示一個反斜杠,防止它被解釋為一個轉義序列符 |
| \n | 換行 |
| \b | 退格符 |
| \r | 回車 |
| \t | 水平制表符,相當于按Tab鍵 |
| ? | 在書寫連續多個?時,防止被解析為三字母詞 |
| ` | 用于表示字符常量` |
| \ddd | ddd表示1~3個八進制數字。如\130表示x |
| xdd | dd表示2個16進制數字。如、x30表示字符0 |
假如我們要在屏幕上打印一個目錄:c:\code\test.c
若將代碼寫成:
實際運行結果為:
如果想讓這串目錄正常顯示,只需要在引起計算機誤會的地方加上一個反斜杠\,來防止譯為轉義字符
2.筆試題
//程序輸出什么? #include <stdio.h> int main() {printf("%d\n",strlen("abcdef"));//\32被解析為一個轉義字符printf("%d\n",strlen("c:\test\328\test.c"));return 0; } //答:輸出6和14 //因為\t是一個字符,\32是一個字符,注意\ddd中的d是從1-3,所以不在里面,沒有被轉義三、注釋
//是C++注釋風格
/**/是C語言風格,有一缺陷是不能嵌套注釋,例如以下情況會報錯
第七節 初識選擇語句&&循環語句
一、選擇語句
#include <stdio.h> int main() {int coding=0;//輸入的值printf("你會去敲代碼嗎? (選擇1 or 0):>");scanf("%d",&coding);if(coding==1)//如果輸入的值為1{printf("堅持,你會有好offer\n");}else//如果輸入的值為0{printf("放棄,回家賣紅薯\n");}return 0; }二、循環語句
//30000代碼-找個不錯工作 int main() {int line=0;//定義變量linewhile(line<30000){printf("寫代碼:%d\n",line);//如果line<30000,執行語句,不滿足,則退出循環line++;}if(line==30000){printf("好offer\n");}return 0; }第八節 初識函數和數組
一、函數
int main() {int num1 = 0, num2 = 0, sum = 0;printf("輸入兩個操作數:>");scanf("%d%d", &num1, &num2);sum = num1 + num2;printf("sum=%d\n", sum);return 0; }上述代碼,寫成函數如下:
int add(int x, int y)//創建整型x和y,來接收傳遞過來的num1和2//add前面的int是返回值的類型 {int z = 0;z = x + y;return z;//將z的值返回給函數add } int main() {int num1 = 0, num2 = 0;printf("輸入兩個操作數:>");scanf("%d%d", &num1, &num2);int sum = add(num1, num2);//將num1和2的值傳遞給x和y,將函數add的值傳遞給sumprintf("sum=%d\n", sum);return 0; }二、數組
要存儲1-10的數字,怎么存儲?
數組:一組相同類型元素的集合
數組定義:
數組訪問規則:數組是由下標來訪問的
第九節 初識操作符
一、算數操作符:+ - * / %(取模,或稱取余,取余數)
二、移位操作符:>>(右移) <<(左移)
int main() {int a=2;//將a存放為整型變量int b=a<<1;//定義b為a左移一位return 0; }左移操作符:移動的是二進制位
a的值為2,換算成二進制就是10,又因為a是放在整型里,整型是4個字節,一個字節是8個比特位,所以要寫出a的二進制序列,要寫出32個比特位,即:
00000000 00000000 00000000 00000010
向左移動一位
0 00000000 00000000 00000000 00000100 //注最左端的移出,最右端補了一個0
補完之后就是100,換算成十進制就是4,所以b=4
三、位操作符:& 按位與 | 按位或 ^ 按位異或
四、賦值操作符:= += -= *= /= &= ^= |= >>= <<=
int main() {int a = 1;a = a + 5;//相當于:a += 5;a = a - 3;//相當于:a -= 3;a = a % 3;//相當于:a %= 3;return 0; }五、單目操作符
什么是雙目操作符:比如a+b; +有2個操作數
單目操作符:只有一個操作數
1. 單目操作符總結
| ! | 邏輯取反 ,把真變成假,把假變成真;0為假,非0為真 |
| - | 負值 |
| + | 正值 |
| & | 取地址 |
| sizeof | 操作數的類型長度(以字節為單位) |
| ~ | 對一個數的二進制按位取反 |
| – | 前置、后置– |
| ++ | 前置、后置++ |
| * | 間接訪問操作符(解引用操作符) |
| (類型) | 強制類型轉換 |
2. !的講解
int main() {// !的語法講解int a=112;printf("%d\n",!a);//輸出0int b=0;printf("%d\n",!b);//輸出1//應用場景if(a){//如果a為真,做事}if(!a){//如果a為假,做事}return 0; }3. + -的講解
int main() {// + -的講解a=-5;//將負五賦值給aa=+a;//將a的絕對值賦給areturn 0; }4. sizeof的講解
int main() {//sizeof是一個操作符,不是函數//它是用來計算類型、變量、數組等的大小的(以字節為單位,一個字節8比特)int a=10;printf("%d\n",sizeof(int));//打印出4,因為整型是4的字節printf("%d\n",sizeof(a));//打印出4,因為整型是4的字節int arr[10]={0};printf("%d\n",sizeof(arr));//結果是40,因為每個元素是一個int,4*10=40//計算的是數組的總大小printf("%d\n",sizeof(arr[0]));//結果是4,因為計算的是元素0的大小//計算元素的個數:int sz=sizeof(arr)/sieof(arr[0]);printf("%d\n",sz);//輸出10,因為一共有10個元素return 0; }5. ~的講解
int main() {// ~是按位取反(二進制);把所有二進制中的數字,1→0,0→1(符號位同樣對待)int a=0;printf("%d\n",~a);//結果為-1//整數a=0,則二進制://00000000 00000000 00000000 00000000 a// ~ 是按位取反,則二進制變為://11111111 11111111 11111111 11111111 ~a(補碼)//printf輸出的是原碼,即://10000000 00000000 00000000 00000001(即十進制是負一)return 0; }(1)整數在內存中存儲規則:整數在內存中存儲的是補碼(注:補碼的補碼為原碼)
一個整數的二進制有3種:原碼、反碼、補碼
-1的原、反、補(以下計算方式只適用于負數)
原碼:10000000 00000000 00000000 00000001(最高位叫符號位,1為負數,0為整數)
反碼:11111111 11111111 11111111 11111110 (反碼就是原碼的符號位不變,其余位,按位取反)
補碼:11111111 11111111 11111111 11111111 (補碼就是反碼+1)
正整數原、反、補碼相同
6.前置、后置++ 前置、后置–
(1) 前置++:先++,后使用; 后置++:先使用,后++
int main() {int a=10;int b=++a;//前置++int c=10;int d=c++;//后置++printf("%d\n",b);//輸出11printf("%d\n",a);//輸出11printf("%d\n",c);//輸出11printf("%d\n",d);//輸出10return 0; }7.強制類型轉換
int main() {//怎么消除這個警告//強制類型轉換int a = (int)3.14;printf("%d\n", a);//輸出3return 0; }六、關系操作符
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| != | 不等于 |
| == | 等于 |
七、邏輯操作符
| && 邏輯與 | 兩個都為真,才為真 |
| || 邏輯或 | 兩個都為假,才為假 |
八、條件操作符(三目操作符):exp1 ? exp2 : exp3 表達式1 ? 表達式2 : 表達式3
含義:若exp1成立,則計算exp2,整個表達式的結果是exp2的結果;若exp1不成立,結果為exp3的結果
int main() {int a=0,b=3,max=0;if(a>b)max=a;else max=b;//上述if語句和下面一行代碼相等max=a>b?a:b;//a>b若成立,將a的值給max;否則將b的值給maxreturn 0; }九、逗號表達式:exp1, exp2, exp3, …expN
含義:逗號隔開的一串表達式,會從左往右依次計算,整個表達式的結果取最右側表達式的結果
int main() {int a=0;int b=3;int c=5;//a=5 c=1 b=3int d=(a=b+2,c=a-4,b=c+2);printf("%d\n",d);//結果為3return 0; }十、下標引用、函數調用和結構成員
1. [ ] () . ->
[ ]是下標引用操作符
//下標引用操作符 int main() {int arr[5]={0};printf("%d\n",arr[5]);return 0; }( )是函數調用操作符
int main() {//調用函數的時候,函數名后面的()就是函數調用操作符printf("hello\n");return 0; }2.**& * . ->**這四個操作符在接下來課程中再詳細講述
第十節 初識常見關鍵字
一、C語言提供的關鍵字的特點
- C語言提供的,不能自己創建關鍵字
- 變量名不能是關鍵字
二、關鍵字總結
| char | 字符類型 |
| double | 雙精度 |
| float | 單精度浮點型 |
| int | 整型 |
| long | 長整型 |
| short | 短整型 |
| signed | 有符號的,如10 -20 |
| unsigned | 無符號的 |
| void | 空 |
| auto | 是自動的意思;每個局部變量都是auto修飾的 |
| break | 在 循環 、Switch語句中會用到 |
| case | Switch case語句中會用 |
| switch | Switch語句 |
| const | 常變量 |
| continue | 繼續 |
| default | 默認 ,在Switch case語句中會用 |
| do | do while循環會用 |
| while | while循環 |
| else | if else語句 |
| enum | 枚舉 |
| extern | 聲明外部符號的;比如在同一工程下另一個.c文件中聲明全局變量或函數 |
| for | for循環 |
| goto | goto語句 |
| if | if語句 |
| register | 寄存器關鍵字,用register創建的變量建議放在寄存器中 |
| return | 返回 |
| sizeof | 求大小 |
| static | 靜態的 |
| struct | 結構體 |
| typedef | 類型重定義別名,可以將類型重新定義成一個新的名字 |
| union | 聯合體(共用體) |
| volatile | c語言中暫時不講 |
三、關鍵字詳講
1. auto
int main() {{int a=10;//是自動創建(進{}),自動銷毀的(出{})——自動變量auto int a=10;//兩串代碼相同(auto通常省略)//auto在新的C語言語法中也有其他用法,暫時不考慮}return 0; }2. register
int main() { //大量頻繁讀取的數據,存放在寄存器中,提升效率register int num=100;//建議num的值存放在寄存器中return 0; }計算機中數據可以存放在哪里:
- 寄存器 更小 ↑ 越往上
- 高速緩存 幾十MB | 造價越高
- 內存 8G-16G | 速度越高
- 硬盤 500G | 空間越小
- 網盤 2T |
注:define和include是預處理指令,不是關鍵字
3.typedef的講解
typedef unsigned int u_int;//將unsigned int定義成u_int,然后這兩個就等價了 int main() {unsigned int num=100;//相當于u_int num=100; return 0; }4.static的講解
① .static修飾局部變量
static修飾局部變量時,改變了局部變量的生命周期(本質上改變了比暗戀的存儲類型)
②. static修飾全局變量
全局變量在整個工程中都可以使用
static修飾全局變量,使得這個全局變量只能在自己所在的源文件(.c)內部可以使用,其他源文件不能使用!
全局變量,在其它源文件內部可以使用,是因為全局變量具有外部鏈接屬性,但是被static修飾之后,就變成了內部鏈接屬性,其他源文件就不能連接到這個靜態的全局變量了!
③. static修飾函數
static修飾函數,使得函數只能在自己所在的源文件內部使用,不能在其他源文件內部使用
本質上:static是將函數的外部鏈接屬性變成了內部鏈接屬性!(和static修飾全局變量一樣)
第十一節 #define定義常量和宏
define是一個預處理指令
一、define定義標識符常量
#define MAX 1000 int main() {printf("%d\n",MAX);//輸出1000return 0; }二、 define定義宏
#define ADD(X,Y) X+Y //注意:宏定義沒有分號 int main() {printf("%d\n",ADD(2,3));//輸出5return 0; } #define ADD(X,Y) X+Y //注意:宏定義沒有分號 int main() {printf("%d\n",4*ADD(2,3));//輸出11,而不是20//4*2+3=11(因為宏是變量的替換)return 0; }怎么讓宏定義按要求輸出結果?答:加括號
#define ADD(X,Y) ((X)+(Y)) //注意:宏定義沒有分號 int main() {printf("%d\n",4*ADD(2,3));//輸出20return 0; }第十二節 指針
一、內存
內存是電腦上的存儲器,計算機中所有的程序的運行都是在內存中進行的。
所以為了有效的使用內存,就把內存劃分成一個個小的內存單元,每個內存單元的大小是1個字節。
為了能夠有效地訪問到內存的每個單元,就給內存進行了編號,這些編號被稱為該內存單元的地址。
理解內存:在現實生活中,給每個空間都編了一個有效的地址,就可以精確地找到一個房間;對于內存也是一樣的。
電腦有32位和64位,32位就是32位地址線→是物理線→通電→有1、0兩種狀態
然后電信號轉換成數字信號:1和0組成的二進制序列
32位從全0變成全1,會有2^32個地址
那么一個32位的內存單元多大呢:4294967296 bit /8=536870912 byte /1024=524288 kb/1024=512MB /1024=0.5GB
bit比特*8=byte字節 *1024=kb *1024=MB *1024=GB *1024=TB *1024=PB
由于一個比特位是一個內存空間,管理的內存空間太少,因此最終取一個內存單元是一個字節,然后分配地址
我們用pa存放a的地址,是為了能找到a,使用a,所以需要解引用來找到a
int main() {int a =10;int* pa=&a;//將a的地址存放在pa變量中*pa=20;// * 是解引用操作 *pa就是通過pa里面的地址,找到aprintf("%d\n",a);//輸出20(借助pa實現對a的操作)return 0; }示意圖:
指針 就是 地址
二、指針變量的大小
在這里可以改成x86(32位平臺),輸出就變成了4
結論:指針的大小在32位平臺是4個字節,64位平臺是8個字節。
第十三節 結構體
1.結構體可以讓C語言創建新的類型出來
比如描述學生,學生包含:名字+年齡+性別+學號 這幾項信息。
這里只能用結構體來描述。
例如:
總結
以上是生活随笔為你收集整理的【比特鹏哥C语言_1.初识C语言】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机虚拟化分类(虚拟机相关)的简单整理
- 下一篇: halcon入门之_提取遥控器字符并且写