指针详解二

                                                               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。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值