指针2(带你玩转指针)

1.const修饰指针变量

首先我们先认识一下const这个关键字。简单来说"const"通常用于修饰常量使其值不能被改变,拥有了类似变量的属性,可以理解为变成了“常变量”。(实际上是改变了修饰常量在内存中的存储位置。)(有点扯远了,想了解的铁铁可以去百度一下。)

先来看一段代码(有点小,还望理解)

我们一个一个运行发现第一个可以运行

第二个 报错,

第三个p3=&m  报错

第四个 *p4=20;  p4=&m;报错

通过这段代码我们可以得出两个结论:

const 放在*号左边修饰的是指针指向的内容,即*p;使得保证指针指向的内容不能通过指针来改变。 但是指针变量(即p)本⾝的内容可变

const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量(p)的内容不能修改,但是指针指 向的内容(*p),可以通过指针改变。

2.指针运算

指针的基本运算有三种,分别是:

• 指针+-整数

• 指针-指针

• 指针的关系运算

2.1指针+-整数

回顾上一节的内容,上一节我们学习了指针加减整数,并且得知指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)。

那么我们来运用一下这个结论解决一个简单问题

用指针打印一个整形数组:

这段代码,我们将数组名赋给了*p。这里有小伙伴要问为什么不加&操作符呢? 因为数组名就是数组首元素的地址,是个地址,所以可以直接用指针接收(但有两个例外&数组名和sizeof(数组名),这个以后我们在细讲)

2.2指针-指针

上面代码我们模拟实现了库函数strlen,可以求出一段字符串的大小;

最后p指向了‘\0’,而s指向的是‘a’;通过指针相减我们得出了字符串的大小,由此我们可知指针减去指针得出的是个指针之间相隔的元素数量。

2.3指针的关系运算

在这段代码中,p<arr+sz就是指针大小的比较,arr数组名表示首元素的大小,arr+sz即加上10,上一节我们学过指针加1,跳过相应的字节(int*为四个,char*为1个)。故该程序会打印整个数组。

3.传值调⽤和传址调用

学习指针的⽬的是使⽤指针解决问题,那什么问题,⾮指针不可呢?

看下面一个例子:

交换a,b两个变量的值

没学过指针我们可能写出这样的代码,但运行结果发现并没有交换a,b的值。这是为什么呢?通过调试我们可以得知,a,b的地址与x,y的地址不一样,这是因为函数的参数是形参(即x和y),而main函数中a,b为实参,x和y确实接收到了a和b的值,不过x的地址和a的地址不 ⼀样,y的地址和b的地址不⼀样,相当于x和y是独⽴的空间,那么在Swap1函数内部交换x和y的值, ⾃然不会影响a和b,当Swap1函数调⽤结束后回到main函数,a和b的没法交换,这 种叫传值调⽤

结论:实参传给形参的时候,形参会单独创建⼀份临时空间来接收实参,对形参的修改不影响实 参。

这里我们可以用指针解决这个问题

我们可以看到实现成Swap2的⽅式,顺利完成了任务,这⾥调⽤Swap2函数的时候是将变量的地址传 递给了函数,这种函数调⽤⽅式叫:传址调⽤

传址调⽤,可以让函数和主调函数之间建⽴真正的联系,在函数内部可以修改主调函数中的变量;所以未来函数中只是需要主调函数中的变量值来实现计算,就可以采⽤传值调⽤。如果函数内部要修改 主调函数中的变量的值,就需要传址调⽤。

创作不易,如果本文章对您有帮助的话,还望点赞支持一下。红色是我最后的倔强了

  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值