当前位置:网站首页>凡人修仙学指针-1
凡人修仙学指针-1
2022-07-06 09:19:00 【程序员Rock】
一、教程目标
- 通过凡人修仙主题,学习C/C++指针,从入门到精通(这里的精通指知识点的掌握)。
- 在指针的使用上,达到企业开发和大面笔试的技术要求。
- 效果演示:轻松实现FPS射击类游戏的无限弹药和锁血、瞬移等功能。
二、教程准备
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); //100
p = p + 1; // p++;
printf("%d\n", *p); // 200
p = 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); // 100
p2 = 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); //200
p1 = 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); // 5
char* 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); // 反向输出各种价格
}
指针的比较运算,是指针中存储的“地址值”, 按照无符号整数的规则进行比较。
边栏推荐
- How to ensure data consistency between MySQL and redis?
- Sharing ideas of on-chip transplantation based on rtklib source code
- 几道高频的JVM面试题
- WSL common commands
- Solution: warning:tensorflow:gradients do not exist for variables ['deny_1/kernel:0', 'deny_1/bias:0',
- Record: solution of 404 error of servlet accessing database in dynamic web project
- IPv6 experiment
- 10 minutes pour maîtriser complètement la rupture du cache, la pénétration du cache, l'avalanche du cache
- Tyut outline of 2022 database examination of Taiyuan University of Technology
- 记录:newInstance()过时的代替方法
猜你喜欢
Smart classroom solution and mobile teaching concept description
Data manipulation language (DML)
如何保障 MySQL 和 Redis 的数据一致性?
记录:初次cmd启动MySQL拒接访问之解决
Chromatic judgement bipartite graph
西安电子科技大学22学年上学期《信号与系统》试题及答案
系统设计学习(一)Design Pastebin.com (or Bit.ly)
系统设计学习(三)Design Amazon‘s sales rank by category feature
[GNSS data processing] Helmert variance component estimation analysis and code implementation
System design learning (III) design Amazon's sales rank by category feature
随机推荐
十分钟彻底掌握缓存击穿、缓存穿透、缓存雪崩
Error: sorting and subscript out of bounds
What are the advantages of using SQL in Excel VBA
【话题终结者】
Tyut outline of 2022 database examination of Taiyuan University of Technology
TYUT太原理工大学2022数据库大题之E-R图转关系模式
FileInputStream和BufferedInputStream的比较
Shortest Hamilton path (pressure DP)
系统设计学习(三)Design Amazon‘s sales rank by category feature
Role movement in the first person perspective
String class
Tyut Taiyuan University of technology 2022 introduction to software engineering
All in one 1405: sum and product of prime numbers
2022 National Games RE1 baby_ tree
One article to get UDP and TCP high-frequency interview questions!
Differences and application scenarios between MySQL index clock B-tree, b+tree and hash indexes
View UI Plus 发布 1.2.0 版本,新增 Image、Skeleton、Typography组件
国企秋招经验总结
Alibaba cloud microservices (IV) service mesh overview and instance istio
Tyut Taiyuan University of technology 2022 "Mao Gai" must be recited