当前位置:网站首页>凡人修仙学指针-1

凡人修仙学指针-1

2022-07-06 09:19:00 程序员Rock

一、教程目标

本教程配套的视频 

  1. 通过凡人修仙主题,学习C/C++指针,从入门到精通(这里的精通指知识点的掌握)。
  2. 在指针的使用上,达到企业开发和大面笔试的技术要求。
  3. 效果演示:轻松实现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);  // 反向输出各种价格
}

指针的比较运算,是指针中存储的“地址值”, 按照无符号整数的规则进行比较。

原网站

版权声明
本文为[程序员Rock]所创,转载请带上原文链接,感谢
https://rock6.blog.csdn.net/article/details/124812083