今天来学习指针的第二节。
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的内容。这里两者的区别就显而易见了。
这次就分享到这里了,下期再见。