hi~
引言:
话接上文,上文我们谈到什么是指针,怎样定义一个指针,以及常见的指针类型的错误。那么接下来我们就来谈谈指针的运算以及二级指针等问题
指针的运算
指针的运算,是不是也像整型的运算一样呢?其实指针的运算包括以下3个方面:
1.指针与整数的运算
2.指针与指针的运算
3.指针关系的运算
先看第一个,指针与整数的运算
定义:可以对指针进行四种算术运算:++、--、+、-
-
加法运算:可以对指针进行加法运算。当一个指针p加上一个整数n时,结果是指针p向前移动n个元素的大小。例如,如果p是一个int类型的指针,每个int占4个字节,那么p + 1将指向p所指向的下一个int元素。p是一个char类型的指针,每个char占1个字节,那么p + 1将指向p所指向的下一个char元素。也就是移动1个字节。
-
减法运算:可以对指针进行减法运算。当一个指针p减去一个整数n时,结果是指针p向后移动n个元素的大小。例如,如果p是一个int类型的指针,每个int占4个字节,那么p - 1将指向p所指向的前一个int元素。
由此可知:指针的整数运算是根据指针的类型来决定移动多少字节的。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 0;
int* p = &a;
printf("%p\n",p);
printf("%p\n", p + 1);
return 0;
}
请输出打印结果
看到第二个指针与指针的运算
-
指针与指针之间的减法运算:可以计算两个指针之间的距离。当从一个指针p减去另一个指针q时,结果是两个指针之间的元素个数。例如,如果p和q是两个int类型的指针,每个int占4个字节,那么p - q将得到两个指针之间的元素个数。
这个我们一般用来算数组的大小,一个指针指向数组的头,一个指向数组的尾,两个一做差,就知道数组的大小了。
看到第三个指针关系的运算
-
指针与整数之间的比较运算:可以将指针与整数进行比较运算。可以使用关系运算符(如<、>、<=、>=)对指针和整数进行比较。这种比较通常用于判断指针是否指向某个有效的内存位置。
二级指针
定义:存放指针的指针就叫二级指针
之前我们说a是一个整型变量,变量里数据需要放到内存空间里,为了以后还能使用这个数据,我们需要记住内存空间的地址,于是就定义指针来存储地址。好了,现在请问,指针是不是也是一个变量?是变量对吧。那么这个变量的数据是不是也需要放到内存空间里?需要是吧。那这个内存空间的地址我们是不是也要记住它?也要存起来?于是,我们就有了存放指针的变量,也叫二级指针。
指针变量也是变量,是变量就有地址,那么这个地址放哪?二级指针。
创建:
一级指针是type+*;那么二级指针是type+**。
下面我们结合代码,来完整的对内存进行剖析,从而加深对二级指针的理解。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a = 15;
int* p1 = &a;
int** p2 = &p1;
printf("%p\n", &a);
printf("%p\n",p1);
printf("%d\n",*p1);
printf("%p\n", p2);
printf("%p\n",*p2);
return 0;
}
请输出打印结果:
&a就是a的地址,p1是指针指向的是a,所以p1就是a的地址。所以前两个打印的值是一样的。*p1就是对p所指向的内容进行解引用,那么就是a的数据,15。p2就是p1的地址,可以看到p1的地址和a的地址是不同的。而*p2就是解引用p2指向的地址,得到的a的地址。
左图是p1变量,也是a的内存空间,可以看到第一个地址里存储0f在16进制下,就是15,然后还有其余3个未用的内存空间。而p1只存储了a的首地址。
右图是p2变量,也是p1的内存空间。指针在64位下是8个字节,p1内存空间有8个字节,可以看到p1里存储的是a的地址,C4-E8,F6-E9,8F-EA,EF-EB,66-EC,00-ED,00-EE,00-EF。而且同样的,p2只存储p1的首地址。
上述过程也就是下图所展示的
结语:
以上就是指针详解二的内容,我们可以发现能够熟练掌握调试功能,查看内存的细节可以帮助我们加深对指针的理解,大家下去之后也要好好试试哦。
都看到这了,不给个赞吗?
这份博客👍如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位🔎点赞👍评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧👀。
好了我是Happysky,编程之路你我一起探索,让我们下期JAN。