随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万

const 与指针

1、分为两种情况:指向const对象的指针,const在*的左边,不能修改指向的内容。const指针,const在*的右边,不能修改指针的指向。

2、赋值给指针的时候,可以缩小权限,但是不能放大权限。也就是说,非const对象可以赋值给指向const对象的指针。但是,const对象不能赋值给指向非const对象的指针,报错:cannot convert from 'const int * ' to 'int *'。对于引用,也是同样道理。

3、注意:指针本身也是传值,整体拷贝。也就是说,const指针可以赋值给非const指针,非const指针也可以赋值给const指针。两边的指针没有关系,仅仅是取值相同。

4、但是,对于指针的指针,或者指针的引用,也是可以缩小权限,但是不能放大权限。

5、注意:有指针的引用,即*&,但是不存在引用的指针,即&*,为什么?

     因为指向引用的指针,语义不合理。引用是对象的别名,指向对象的别名,也就是指向对象,因此,引用的指针没有存在的必要性。

6、考虑 char* aaa = "Andy"; "Andy"是文本字符串常量,分配在静态存储区,不允许修改内容,它的返回值是指向const对象的指针,指针的值是首字符地址。可以修改aaa的指向,但是不能指向的内容。修改指向的内容,编译没错,运行报错。那么问题来了,右边是const char*,左边是char*,为什么编译不报错? 可以认为是兼容以前的代码,C代码中存在大量这样的代码。但是,我们尽量写成const char* aaa = "Andy"; 这样的话,就把运行期错误提前到编译期。

7、 考虑char bbb[] = "Bill"; 可以这样理解,在栈上分配5个字节,存储'B','i','l','l','\0',假设'B'的栈上地址是0x12345678,bbb就是这个地址的别名。bbb是个const指针,可以修改内容。不能修改指向,如果修改,如bbb++,编译报错:'++' needs l-value

posted on   Andy Niu  阅读(1223)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2012-03-07 理解IP和端口
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示