指针(2)

今天来学习指针的第二节。

const修饰指针

1.const修饰变量

const代表常属性,被const修饰后的变量为常变量,常变量的本质是变量。但是由于语法限制无法对常变量进行直接修改。 

如上图b为常变量无法对b直接修改。 但是如果我们就是要改变b的值该怎么操作呢?

如上图我们对b的地址下手,绕过b本身就成功了。

2.const修饰指针变量 

上面我们从b的指针下手,改变了b的值,然而我们同样可以用const修饰指针来阻止其修改。

此处我们用const修饰的是指针变量,但是我们发现此时无法对*pa进行修改,反而可以改变pa中的内容。那很容易就想到这和const的位置有关。

 

这里我们将const放在*后面,发现与前面情况正好相反,无法改变pa,可以改变*pa。那么我们就可以得出结论。如果const在*左边修饰的是指针指向的内容,保证指针指向的内容无法通过指针来改变,但是指针本身可以改变。如果const在*右边,则修饰的是指针本身,无法改变指针修饰的内容。 

野指针 

接下来介绍一下野指针。野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。

情况1

情况2

指针访问的空间超过了数组大小,成为野指针。 

情况3 

当n的地址被返回给pa时n的内存即刻销毁,系统中找不到n的指针,从而pa成为野指针。

规避野指针

如何规避野指针,很简单,对症下药即可。

1.初始化

当知道指针指向哪里时,就明确出来。当不知道指针指向哪里时,可以将指针初始化为NULL。NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址会报错。

2.及时重新赋值

3.避免指针越界
4.避免返回局部变量的地址

指针的使用

接下来我们通过使用指针来实现对strlen函数的模拟。

使用指针找到了字符串的首个元素地址,用一个指针变量来接受,通过使用while循环当*p为非0时count+1,当到达字符串末尾有个\0省略,但是*p此时会为0,从而无法进入循环,完成对strlen函数的实现。(后期会讲strlen和sizeof的区别)

传值调用和传址调用 

在对函数实行传参过程中,有时需要传递地址而有时需要传递数值,那么为何能传值,却要传递地址呢。下面为我们给出两者的区别。

这里我们要实现两个数内容的交换,发现当我们传值后无法改变a和b中的内容,但是传址却可以。原来传值改变的实际上改变的是xy中的内容,而传址后解引用才能改变ab的内容。这里两者的区别就显而易见了。

这次就分享到这里了,下期再见。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值