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函数的时候是将变量的地址传 递给了函数,这种函数调⽤⽅式叫:传址调⽤。
故传址调⽤,可以让函数和主调函数之间建⽴真正的联系,在函数内部可以修改主调函数中的变量;所以未来函数中只是需要主调函数中的变量值来实现计算,就可以采⽤传值调⽤。如果函数内部要修改 主调函数中的变量的值,就需要传址调⽤。
创作不易,如果本文章对您有帮助的话,还望点赞支持一下。红色是我最后的倔强了