C语言指针初步(3)-关于const修饰的指针和指针的几个小性质

本期重点:const修饰的指针、指针-指针、指针-数字


const是一个常量声明,但是它是用于修饰变量的,它并不能把变量变成常量,而是将其转变为常变量,也就是说,这个量仍然是变量,只不过它已经不可以被修改了,它仅仅是一个无法被修改的变量,这不意味着它本身就是常量。

就好像你给一只棕熊画上熊猫的颜色,虽然看起来确实是熊猫,但是它其实是棕熊。

const修饰指针有两种位置可以选择,下面用int*类型的指针作为演示:

#include<stdio.h>
int main() {
	int num = 57;int NUMber=23;
	int* pnum_1 = &num;
	const int* pnum_2 = &num;
	/*int const* pnum_3 = &num;*/
	int* const pnum_4 = &num;
	return 0;
}

现在我们用const修饰在int*的*的左边,也就是pnum_2指针。

如果我们对pnum_1进行解引用,我们就可以通过pnum_1里面存有的num的地址找到num,从而对num的数值进行改变。如果我们觉得pnum_1已经不需要用于存储num的地址而是存储NUMber的地址的话,我们直接用

pnum_1=&NUMber;

就可以实现我们的目的,从而把pnum_1本身的存储物进行改变。

但是如果我们看pnum_2的话就会发现,我们解引用pnum_2是不可能的,*pnum_2=15;已经不可以将num里面的存储值变成15而不是原本的57,但是如果有朝一日我们发现,pnum_2已经不需要存储num的地址而是需要变成指向NUMber的指针的话,那反而是可以做到的:

也就是说,这个时候pnum_2指针变成了一个只能指向但是无法对所指向的变量进行修改的指针。它也许可以解引用,但是它绝对无法修改指向对象的数值,这是因为const修饰了int*的星号的左边的缘故。这使得整个*pnum_2都变成了常量,因此再对*pnum_2进行更改就变得不可能了,然而pnum_2本身并没有与const直接相接,因此它仍然是可以修改的。

下面再来看const修饰*右边的情况:

#include<stdio.h>
int main() {
	int num = 57; int NUMber = 23;
	int* pnum_1 = &num;
	const int* pnum_2 = &num;
	/*int const* pnum_3 = &num;*/
	int* const pnum_4 = &num;
	pnum_4 = &NUMber;
	*pnum_4 = 15;
	return 0;
}

这时候我们发现,pnum_4本身存储的地址反而不能改变了,他现在可以解引用,也可以将num里面的值修改为15,然而却不能够改变自身存储的地址。因为这个时候const直接与pnum_4相连,这导致pnum_4虽然是一个int*类型的指针,但是却是个常变量,因此无法修改,而*pnum_4则没有与const相连,因此它并不是常变量,仍然可以修改。

下面我们说一下指针减去一个常数是什么:

从上图可以看出,arr数组名存储的地址是arr[0]的地址,pa+1的地址则是给pa的地址加上一个字节,也就是4,而pa和pa+1指向的对象分别是arr[0]和arr[1],这说明指针(或者说地址)的本质其实是数字,而对他进行加减,就说明把指针的位置向后移动一格,这是一个非常好用的技术,可以用于打印数组之类的。

由此我们可以推断出指针减去指针是什么了:是一个数字!,指针的本质是地址,那么指针减去指针就是地址减去地址,地址是一个数字,那么差当然也是数字:

比如用&arr[1]-&arr[0]我们就会得到1,因为&arr[0]+1=&arr[1],移项的结果就是差,也就是1。

类似的方法可以用于判断两个指针在内存中位置的距离。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

St_Ludwig

求求辣赞助一点米叭,我有大计划

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值