当前位置:网站首页>凡人修仙学指针-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); // 反向输出各种价格
}
指针的比较运算,是指针中存储的“地址值”, 按照无符号整数的规则进行比较。
边栏推荐
- 系统设计学习(二)Design a key-value cache to save the results of the most recent web server queries
- Heap sort [handwritten small root heap]
- 学编程的八大电脑操作,总有一款你不会
- Relational algebra of tyut Taiyuan University of technology 2022 database
- 面渣逆袭:Redis连环五十二问,三万字+八十图详解。
- FileInputStream和BufferedInputStream的比较
- 西安电子科技大学22学年上学期《信号与系统》试题及答案
- GNSS positioning accuracy index calculation
- 西安电子科技大学22学年上学期《基础实验》试题及答案
- 用栈实现队列
猜你喜欢
Detailed explanation of balanced binary tree is easy to understand
系统设计学习(一)Design Pastebin.com (or Bit.ly)
(超详细onenet TCP协议接入)arduino+esp8266-01s接入物联网平台,上传实时采集数据/TCP透传(以及lua脚本如何获取和编写)
Code example of MATLAB reading GNSS observation value o file
Application architecture of large live broadcast platform
RTKLIB: demo5 b34f. 1 vs b33
MYSQL索引钟B-TREE ,B+TREE ,HASH索引之间的区别和应用场景
TYUT太原理工大学2022数据库大题之分解关系模式
Alibaba cloud microservices (IV) service mesh overview and instance istio
图书管理系统小练习
随机推荐
Inheritance and polymorphism (I)
Heap sort [handwritten small root heap]
Tyut Taiyuan University of technology 2022 "Mao Gai" must be recited
阿里云微服务(二) 分布式服务配置中心以及Nacos的使用场景及实现介绍
Data manipulation language (DML)
分支语句和循环语句
记录:Navicat Premium初次无法连接数据库MySQL之解决
TYUT太原理工大学2022数据库考试题型大纲
Voir ui plus version 1.3.1 pour améliorer l'expérience Typescript
XV Function definition and call
初识C语言(下)
Implementation of Excel import and export functions
How to ensure data consistency between MySQL and redis?
异常:IOException:Stream Closed
Fundamentals of UD decomposition of KF UD decomposition [1]
Abstract classes and interfaces
《软件测试》习题答案:第一章
Record: solution of 404 error of servlet accessing database in dynamic web project
图书管理系统小练习
12 excel charts and arrays