const与指针、指针的指针、引用与指针

本文深入探讨了C++中const关键字的作用及其与指针的结合使用,解析了const修饰不同对象的意义,以及如何定义和使用指向常量的指针、指针常量和二级指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

const与指针

const是一个C语言(ANSI C)的关键字,具有着举足轻重的地位。它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。

const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。

阅读以下代码及错误提示,体会它的作用:

#include <iostream>
#include <Windows.h>

using namespace std;

int main(void){
	const int a=10;
	a=20;
	printf("a=%d\n",a);
	system("pause");
	return 0;
}

在这里插入图片描述
到这里相信大家体会到了const的作用,它限定了该变量为一个固定的值,无法改变,需要注意的是,如果你要初始化一个const修饰的变量,你必须给它赋初始值,不然就会出现以下情况:
在这里插入图片描述
了解了这个,我们再来看看const与指针.

#include <iostream>
#include <Windows.h>

using namespace std;

int main(void){
	int a=10;
	const int *var1; //指向静态变量的指针
	int* const var2=&a; //指向变量的指针常量
	const int* const var3=&a; //指向静态变量的指针常量
	var1=&a;

	printf("a=%d *var1=%d *var2=%d *var3=%d\n ",a,*var1,*var2,*var3);

	system("pause");
	return 0;
}

在这里插入图片描述
这段代码定义了三个指针,都指向变量a,但是这三个指针的性质不一样.
先记住要点:const离谁近就修饰谁.第一个const int *var1;const离类型int近,所以这个指针它是普通的指针,它指向静态变量,也就是说它指向的变量的值不可以修改.第二个int * const var2=&a;const离变量名近,所以这个指针它是一个静态指针,也就是说它只能一直指向一个变量,不能让它指向其他的变量.第三个const int * const var3=&a;const既修饰类型int,又修饰变量名,所以这个指针是一个既不能指向其他变量的指针,它指向的变量又不可以修改,是第一个和第二个的综合.跟上面一样,如果你初始化的变量被const修饰的话,你必须给它赋初始值,不然就会报错,这也就是为什么var1可以不用赋初值而var2和var3要赋初始值.

指针的指针

#include <iostream>
#include <Windows.h>

using namespace std;

int main(void){
	int a=10;
	int *var1=&a; //指向变量a的指针
	int **var2=&var1; //指向指针var1的指针,即二级指针

	printf("a=%d *var1=%d **var2=%d\n",a,*var1,**var2);

	system("pause");
	return 0;
}

在这里插入图片描述
我画了个图让大家简单认识一下二级指针,一级指针存的是变量的地址,而二级指针存的是指向变量的一级指针的地址.
在这里插入图片描述
要注意的是定义二级指针的时候需要*号,如果你尝试用一级指针完成这个事的话你会发现通不过编译,如下:
在这里插入图片描述
所以几级指针就要写几个*号!

C++引用与指针

考过软考初级程序员的同学对这道题应该不陌生,里面提到了传引用
在这里插入图片描述
当时的我很懵,不知道引用是什么,全当指针去理解.后来才知道,引用和指针还真有点关系.

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;

#include <iostream>
#include <Windows.h>

using namespace std;

int main(void){
	int a=10;
	printf("a=%d\n",a);
	int &b=a; //a的别名
	printf("b=%d\n",b);

	a=100;
	printf("a=%d b=%d\n",a,b);

	b=1000;
	printf("a=%d b=%d\n",a,b);

	system("pause");
	return 0;
}

在这里插入图片描述
从以上代码可以看出,引用变量其实就是一个变量的别名.这就好比你有自己的大名,也有自己的小名,还有自己的外号一样,喊你的大名也是在叫你,喊你的小名也是在叫你,喊你的外号也是在叫你.修改引用变量实际上就修改了目标变量.
说明:
(1)&在此不是求地址运算,而是起标识作用。
(2)类型标识符是指目标变量的类型。
(3)声明引用时,必须同时对其进行初始化
(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
查看他们的地址:
在这里插入图片描述
那么问题来了,引用占不占内存空间?
既然是别名,那是不是就不占内存空间呢?这里我们用struct结构类型来测试.

“结构”是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构即是一种“构造”而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义一样。

#include <iostream>
#include <Windows.h>

using namespace std;

struct text{
	int &a;
	int &b;
};

int main(void){
	
	printf("int的大小为:%d 结构体text的大小为:%d\n",sizeof(int),sizeof(text)); //sizeof作用就是返回一个对象或者类型所占的内存字节数

	system("pause");
	return 0;
}

在这里插入图片描述
看的出来其实是占内存空间的,这就要从引用和指针的关系说起.在C++编译器内部,实现引用的方法其实是指针常量,也就是int* const b;在使用b时也自动帮你变成了*b.这样讲解有利于理解引用的本质,但一般情况下,我们并不需要考虑编译器是如何实现的,我们只需要知道如何去使用它.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值