不行,我不能停下,我的粉丝和童鞋们还在等着我。指针,继续肝!

害,最近几天有点懒,没有发博文,在干先说声抱歉哈,愿粉丝和想学指针的童鞋们能原谅我的懒惰。今天怀着这样的情绪,无论如何也要给大家分享一些有价值的知识。

好了,基于我发布的前两篇博文,我们都对指针有了一定深度的了解,粗略包含指针的基本类型、作用、指针变量的大小、指针能做啥事等。

在我分享之前,我得提醒童鞋们:我前两篇博文非常的重要,它是我们往后学习指针的基础也是指针入门必须理解透的知识,往后的分享都是在前面的基础上。说白了,往后指针的使用几乎都是和我们之前学过的知识联合使用罢了,比如各种数据类型的数组指针、各种数据类型的指针数组、函数指针、函数指针数组等等。现在先分享一个比较简单的知识,之前我们说过指针存储的是数据的地址,那么这个地址该如何去得到呢? 答案就是通过 取地址符(&),通过&我们就能得到目标数据的地址从而去访问到它里面的数据。int*  num = &sum 就是指针变量 num通过 &得到sum的地址然后访问sum。接着分享的是 指针的解引用(*num) ,说到这个有童鞋就问了,何为指针的解引用呢?我理解的是其实 指针的解引用 只是一个专业一点的说法罢了,本质就是我们既然得到了目标元素的地址,那接下来肯定是要访问存储在里面的元素啊!通过指针解引用就 “相当于” 是直接访问该元素了,童鞋,这么通俗易懂的解释我想你应该理解了吧。

我们通过前两篇博文都知道,基本的指针类型有int*、char*、double*、float*。它们分别存储整形变量、字符变量、浮点型变量的地址对吧。现在有这么两句代码 int* p = # p = p + 4;我想问童鞋们,其中这 p = p + 4,这句代码是啥意思,咱该如何去理解它? 我想大部分初学的童鞋应该是不清楚的,我提醒你一下,这与 int类型所占的字节大小有关 (若你不懂,愿你看到这里先不要看我后面的解释,自己发动你聪明的脑袋,仔细琢磨琢磨,这可比我直接告诉你更有意义哟)。哈哈哈,我来解释吧首先 p 是一个指向整形的指针变量对吧,p = p + 4是将p + 4的结果赋值给 p。相信童鞋们之前都学过数组对吧,在一个整形数组 int arr[10] 中遍历数组的时候,假设刚访问完 arr[1],现在要访问arr[2],我想问童鞋们在计算机内存中,这一过程是如何实现的?数组是连续存储的而且一个int类型变量占 4 个字节,说到这了,童鞋此刻不知你是否明白了。是的,arr[1]就是要跳过4个字节后才能访问arr[2],这里插入一个知识点:数组名 arr 本质就是该数组的首地址。你听懂我说的这里,再去看上面的 p = p + 4 童鞋我想你应该是明白了吧。你看arr[1] 到 arr[2] 就相当于是指针 arr + 1,那么 p = p + 4 就是 p 原本指向的地址 加上 4 * 4之后所指向的地址空间,再将这个地址赋给 p。代码例子如下:

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int* num1 = &arr[0];
	int* num2 = num1 + 3;
	printf("%p\n", num2);
	return 0;
}

在基于上面的分享,现在我们在来说 指针 - 指针 的结果又是啥。举个栗子:还是一个整形数组 int arr1[10],现在有一下三句代码 int* pro1 = &arr[2]; int* pro2 = &arr[8]; int num = pro2 - pro1;首先我们 先来逐句分析代码, int* pro1 = &arr[2]; 我想在经过我前面的讲解后,童鞋们理解这句代码应该没问题吧,就是将数组元素arr[2]的地址 赋值给指针pro1,同理第二句代码也是将数组元素arr[8]的地址 赋值给指针pro2,最后一句就是将pro2 - pro1 的结果赋值给 num。我想前两句童鞋们都没有问题,问题就在第三句这pro2 - pro1 到底是啥意思,结果又是啥呢?我相信眼尖的童鞋看到了接收的类型是int,说明它是一个整数,那这个整数等于多少呢?这与我上面说到的 p = p + 4 有很大的关系。童鞋们,若你真心想学好指针,一定要自己动脑思考怎么做,思路我已给你了,你自己弄懂的比我分享给你的映像更加深刻。OK,不扯了,接着说pro2取的是arr[8]的地址,pro1取的是arr[2]的地址,pro2 - pro1 就是这两个地址之间的差值啊,在编译器中得到这个值之后并不会直接返回给num 而是将其除以 4 再返回最终得到的结果是arr[2]与arr[8]之间的元素个数。这样做的原因是这是C语言的语法规则,在计算得到 pro2 - pro1 后还有一步计算,就是 (pro2 - pro1)/ sizeof(int) 。代码例子如下:

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int* num1 = &arr[0];
	int* num2 = &arr[4];
	int num3 = num2 - num1;
	printf("%d\n", num3);
	return 0;
}

OK,今天就分享到这里,以上都是我个人的观点。童鞋们,这些知识不要急于一下子就把它给全弄懂,学习是一个循序渐进的过程,咱们的一步一步的来,要慢慢的消化,在这个过程中我相信你会体会到指针的魅力的。

最后还是那句话,我的粉丝和童鞋们,愿你们能受益。如果可能的话也希望你们分享给其他想学指针的童鞋,好了,告辞。

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值