凡人修仙学指针-1
一、教程目標
本教程配套的視頻?
二、教程準備
1. 準備好任意一款開發環境。gcc, g++, vs, devc++, vscode等任意一種即可。
2. 不懂修仙,也可以零障礙的掌握這個教程。
三、教程大綱
四、凡人修仙對我的影響
凡人修仙傳,特別是后期,有很多槽點。不過瑕不掩瑜,每一個IT人,都能在里面找到自己的影子。三體的黑暗森林法則,無法反駁,也無法實證,離我們太遙遠了。而修仙世界中的弱肉強食叢林法則,卻是現在看得見,摸得著的。每一位自學者,就是那些沒有任何依靠的散修,一路上,各種坑和陷阱...
跟隨Rock,一起來修煉吧,徹底征服C/C++指針,快速提升自己的技術實力!
?
?五、指針練氣期
5.1?指針零基礎快速入門
我要去亂星海,尋找修仙洞府,那里靈氣旺盛,只是離我們中土大陸太遠了,相隔萬里,怎樣才能“瞬移”? 修仙界的“傳送陣”,你值得擁有!
傳送陣就是修仙界中的“指針”。
5.1.1 使用“指針”制作自己的傳送陣
char LuanXingHai; // 亂星海, 修仙世界中一個靈氣非常充裕,特別適合修仙的大陸。// 讓亂星海,設置為H, 方式1: LuanXingHai = 'A'; printf("%c\n", LuanXingHai);// 假設我們沒有權限直接對 LuanXingHai 設置數據,就可以使用方式2: // 1. 記錄LuanXingHai的地址 int addr = &LuanXingHai; // 2. 做一個傳送陣,就是“指針” char* p; // 3. 把LuanXingHai的地址,賦值給傳輸陣 p = addr; //注意使用C++語言編譯器時,需要做強制類型轉換 // 4. 使用傳送陣(指針),傳送數據 *p = 'H';printf("%c\n", LuanXingHai);?使用指針傳送陣,瞬移到修仙圣地-亂星海。
5.1.2 傳送陣(指針)的兩種用法
// 第一種用法:把指定目的地的數據讀出來,也就是“讀” char value = *p;// 第二種用法,把數據“傳輸”到指定的目的地,也就是“寫” *p = 'H';5.1.3?指針和地址的關系
指針的值,本質上就是一個地址。
指針,相當于一個傳送陣。這個傳送陣,需要先由修仙者甚至一個目的地,這個目的地,就是需要目標傳輸地址,也就是這個“指針”的值。
5.1.4?指針的類型
不同類型的傳送陣,能夠傳輸的物體不同,強行傳送,講導致“空間裂縫”,導致物體被毀。
不同類型的指針,也只能傳輸特定類型的數據,強行傳送,可能導致數據損壞等不可預期的后果。
int lingShi = 512; // 靈石,修仙界中的一種通用貨幣,相當于世俗社會的黃金 char * p = &lingShi; //C++編譯器需要做強制類型轉換 *p = 1; printf("%d", lingShi); // 在小端格式的計算機中,輸出 513特別注意,在C++編譯器中(文件的后綴為.cpp默認使用c++編譯器),不同類型的指針直接賦值,會編譯失敗,需要強制類型轉換,但是在很多C語言編譯器中,可以直接賦值。
類型不匹配的指針,強行訪問,可能導致不可預期的后果!類似修仙界中的“空間裂縫”,非常危險!魔界的上古魔獸,就是從空間裂縫中入侵人間,導致生靈涂炭...
5.1.5?指針的底層理解
int lingShi = 100; // 靈石,修仙界中的一種通用貨幣,相當于世俗社會的黃金 int * p = &lingShi;printf("%d", *p); //需要連續訪問兩次內存5.2?指針的加法和減法
?我們一起在修仙界中的黑市逛一下,順便學會指針的加法和減法。
指針加整數
大步逛黑市,詢問價格:
// 修仙界黑市中,1級到8級妖獸的價格 int prices[8] = { 100, 200, 500, 800, 1000, 2000, 5000, 10000 };// 逛黑市詢問妖獸的價格 int* p = &prices[0]; //prices; printf("%d\n", *p); //100p = p + 1; // p++; printf("%d\n", *p); // 200p = p + 2; printf("%d\n", *p); // 800?小碎步逛黑市,詢問價格:
// 修仙界黑市中,1級到8級妖獸的價格 int prices[8] = { 100, 200, 500, 800, 1000, 2000, 5000, 10000 };char* p2 = &prices[0]; //prices; printf("%d\n", *p2); // 100p2 = p2 + 1; // p++; printf("%d\n", *p2); // 0?原因分析:
?結論:指針+1, 指向該指針的下一個“數據”。如果是char*指針,那么就前進一個字節,指針的值只加了1。如果是int*指針,那么就指向下一個整數,而一個整數是占4個字節的,所以指針的值,實際上被加了4.
p = p + n;? ?// 指針p的值,增加了? n*sizeof(p指向的數據的數據類型)
指針減整數
大步后退查看價格
// 修仙界黑市中,1級到8級妖獸的價格 int prices[8] = { 100, 200, 500, 800, 1000, 2000, 5000, 10000 };int* p1 = &prices[1]; //prices; printf("%d\n", *p1); //200p1 = p1 - 1; printf("%d\n", *p1); //100小碎步后退查看價格
// 修仙界黑市中,1級到8級妖獸的價格 int prices[8] = { 100, 200, 500, 800, 1000, 2000, 5000, 10000 };char* p2 = &prices[1]; //prices; p2 = p2 - 1; printf("%d\n", *p2); // 0?原因分析:
?p = p - n;? ?// 指針p的值,減少了? n*sizeof(p指向的數據的數據類型)
指針減指針
// 修仙界黑市中,1級到8級妖獸的價格 int prices[8] = { 100, 200, 500, 800, 1000, 2000, 5000, 10000 };int* p1 = &prices[0]; int* p2 = &prices[5]; printf("%d\n", p2 - p1); // 5char* p3 = &prices[0]; char* p4 = &prices[5]; printf("%d\n", p4 - p3); // 20?指針減指針,結果為這兩個指針之間間隔了多少個“對應類型”的數據。
指針的比較運算
// 修仙界黑市中,1級到8級妖獸的價格 int prices[8] = { 100, 200, 500, 800, 1000, 2000, 5000, 10000 };for (int *p1 = prices; p1 < prices + 8; p1++) {printf("%d ", *p1); // 正向輸出各種價格 }printf("\n");for (int* p1 = prices+7; p1 >= prices; p1--) {printf("%d ", *p1); // 反向輸出各種價格 }指針的比較運算,是指針中存儲的“地址值”, 按照無符號整數的規則進行比較。
總結
- 上一篇: Golang开发新手常犯的50个错误
- 下一篇: LDO线性稳压器详解