C++学习日记1(`*`的理解、const关键词)

C++学习日记1(*的理解、const关键词)

一、指针

​ 之前我总是不能理解为什么在定义指针变量时是int* a,而当给这个指针变量指向的地址赋值时却是*a = b,明明都是*,在定义时却表示指针,但赋值时却又表示指针指向的值,但是之前我一直没有深究,知道今天我在学习const与指针结合的场景下,我在定义两个指针变量时所需要写的是int *a, *b,这样才能表示,我的a、b为两个指针变量,而int* a, b这种情况只会表明你定义了一个int型指针变量a,与一个int型变量b。于是我就又查了一下关于这个*的理解并得到了以下内容。

​ 在语义上,我总习惯将int*绑定为了一个整体,表示指向整数的指针类型。但在C/C++语言的语法里,写int *a时,他的逻辑并不是我定义了一个int*型的变量a,而是我定义了一个表达式*a,这个表达式计算后的结果是int,由此就可以突然感悟出其实不管是在赋值表达式,还是在定义表达式里*的作用都是用来表示某个指针指向的值的一个运算符。

二、const关键词

​ 我学习这部分的灵感主要是我今天遇到的一个问题:

c++ 复制代码
	const * int p = &a;

	int * const p = &a;

​ 说一下这两者之间的区别?

​ 我当时以为这是我一看便会的,因为之前这还是我特意去查过的,但是我一想忽然发现我全都忘记了。。。于是我就在自己的编译器里尝试了一下,得到了以下结果

c++ 复制代码
#include <iostream>

int main() {
	int a = 5, b = 10;
    
	const int *c1 = &a;
//	*c1 = b;    // 报错:表达式必须是可修改的左值,这个const修饰的是*c1这个int型数据,所以对于该指针变量所指地址的值是不能更改的
	std::cout << *c1 << " ";
	c1 = &b;
	std::cout << *c1 << std::endl;
    
	int *const c2 = &a;
	*c2 = b;
	std::cout << *c1 << " ";
//	c2 = &b;	// 报错:表达式必须是可修改的左值,这个const修饰的是c2这个数据,所以对于该指针变量所指的地址是无法更改的
	std::cout << *c1 << std::endl;
    
	const int * const c3 = &a;
//	*c3 = b;	// 报错:表达式必须是可修改的左值,第一个const修饰的是*c3这个数据,所以对于该指针变量所指的地址的值是不能更改的
	std::cout << *c1 << " ";
//	c3 = &b;	//报错:表达式必须是可修改的左值,第二个const修饰的是c3这个数据,所以对于该指针变量所指的地址是无法更改的
	std::cout << *c1 << std::endl;
}

​ 因为最开始的我是并没有理解到*这个运算符真正的含义,到时我始终对于这一块的理解疑似有些误区,但了解了运算符*后,发现const其实就是用来修饰后面的这个表达式整体,只要没有直接对这个整体进行赋值或者修改等操作,就是可以的。

相关推荐
ThornArmor17 分钟前
重铸1996|肉体渲染:关节的裂缝:分段模型积木拼装与未成熟的 RSP 矩阵骨骼动画形变
c语言·汇编·c++·python·硬件架构·游戏机
Dreams_l40 分钟前
死信队列和延迟队列介绍
java·开发语言
Zenova EdgeOS1 小时前
Python 工业边缘 redis-py 异步实战
开发语言·redis·python
君顾12 小时前
西安 24 小时自助健身房系统开发实战指南
java·开发语言·健身房
Elsa️7462 小时前
算法一周刷题总结
c++·算法
风合星语2 小时前
2026 机器人工程实例(五):让 Allegro Hand 在 MuJoCo 中完成接触抓取——抓取状态机、稳定抬升与受控释放
c++·python·机器人·仿真
小羊没烦恼!2 小时前
Memory 记忆设计讨论:Agent Memory 的数据模型可以怎么设计
java·开发语言·前端·c++·c#
程序猿编码3 小时前
两张 3090 扛 27B:Qwen3.8-27B 大模型 DFlash2 加速版生产级落地
开发语言·gpt·深度学习·神经网络·大模型·qwen
welfare9623 小时前
新号别搞:内存管理+模板初阶+STL简介
开发语言·c++
敲代码的瓦龙3 小时前
Jetpack?ViewModel!!!
android·开发语言·kotlin·android-studio