当前位置:网站首页>凡人修仙学指针-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); // 反向输出各种价格
}
指针的比较运算,是指针中存储的“地址值”, 按照无符号整数的规则进行比较。
边栏推荐
- 异常:IOException:Stream Closed
- Smart classroom solution and mobile teaching concept description
- Music playback (toggle & playerprefs)
- 记录:初次cmd启动MySQL拒接访问之解决
- 121 distributed interview questions and answers
- TYUT太原理工大学2022数据库之关系代数小题
- Role movement in the first person perspective
- 一文搞定 UDP 和 TCP 高频面试题!
- 阿里云微服务(三)Sentinel开源流控熔断降级组件
- 系统设计学习(二)Design a key-value cache to save the results of the most recent web server queries
猜你喜欢
2-year experience summary, tell you how to do a good job in project management
Application architecture of large live broadcast platform
Iterable、Collection、List 的常见方法签名以及含义
系统设计学习(三)Design Amazon‘s sales rank by category feature
TYUT太原理工大学2022“mao gai”必背
Rt-ppp test using rtknavi
Interview Essentials: talk about the various implementations of distributed locks!
Application architecture of large live broadcast platform
十分钟彻底掌握缓存击穿、缓存穿透、缓存雪崩
西安电子科技大学22学年上学期《基础实验》试题及答案
随机推荐
TYUT太原理工大学2022软工导论考试题型大纲
分支语句和循环语句
121道分布式面试题和答案
Alibaba cloud side: underlying details in concurrent scenarios - pseudo sharing
TYUT太原理工大学往年数据库简述题
121 distributed interview questions and answers
西安电子科技大学22学年上学期《射频电路基础》试题及答案
西安电子科技大学22学年上学期《基础实验》试题及答案
MySQL Database Constraints
165. Compare version number - string
View UI Plus 发布 1.1.0 版本,支持 SSR、支持 Nuxt、增加 TS 声明文件
10 minutes pour maîtriser complètement la rupture du cache, la pénétration du cache, l'avalanche du cache
Record: solution of 404 error of servlet accessing database in dynamic web project
Alibaba cloud microservices (IV) service mesh overview and instance istio
[GNSS data processing] Helmert variance component estimation analysis and code implementation
西安电子科技大学22学年上学期《信号与系统》试题及答案
13 power map
Abstract classes and interfaces
TYUT太原理工大学2022数据库大题之分解关系模式
TYUT太原理工大学2022数据库大题之E-R图转关系模式