C++ const 引用 和 const 指针(补充)

本文详细介绍了C++中const引用和const指针的用法,包括char* const&、const char* & 和 const char * const & 的区别。文章通过实例解析了各种情况下的const引用和const指针,强调了引用不是对象,而是已存在对象的别名,以及如何判断引用是否为常量引用。

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

上文: 

c++ const 引用和 const 指针

const 引用 

        引用不是对象(引用并非对象,它只是为一个存在的对象所起的另外一个名字),所以const的引用只能是底层const(指向的对象是常量),因此,const的引用的关键字放在类型前面或者后面,都表示相同的含义(都表示一个指向常量整数的引用)。const的引用也称常量引用(但你得明白这只是个简称,因为并不存在常量引用)。

const int x = 5;
const int & a = x;  // a是一个指向常量整数x的引用

int const y = 10;
int const & b = y;  // b是一个指向常量整数y的引用

 char* const& x 

        char * const& x 表示指向字符指针的常量引用(“常量引用”即指向常量的引用,这里字符指针是常量),可以解释为:x 是一个常量引用,它引用了一个指针,这个指针指向一个字符并且这个指针本身的值不能被改变(即它不能被重新指向其他地址),但所指向的字符的值是可以改变的。

char arr1[] = "Hello";
char arr2[] = "world";
char* const ptr1 = arr1;        
char* const& x = ptr1;

// 通过x修改字符数组的内容
x[0] = 'h';
std::cout << arr1 << std::endl;  // 输出 "hello"

x=arr2;      //非法, x是常量引用(即指向 常量指针), 不能修改所指向的值(指针的指向), 

  上述代码中数组名arr1会被当作字符串"Hello", c++ 中 当一个字符数组作为右值使用时,它会自动转换为指向其首元素的指针,即数组名会被解释为指针。而对于字符指针(即指向字符的指针),会将其视为以null字符结尾的字符串。可以结合字符数组(小tips) 这篇文章理解。

const char* & x (char const *& x这两种写法等价)

      const char* & x 表示指向常量字符指针的引用,可以解释为:x 是一个引用,它引用了一个指向常量字符的指针。这个指针的指向可以改变(即它可重新指向其他地址),但是这个指针指向的对象的值不能改变。

char arr1[] = "World";
char const* ptr1 = arr1;
char const* &x = ptr1;

std::cout << ptr1 << std::endl;  // 输出 "World"

// 修改指针指向不同的常量字符
char arr2[] = "Hello";
char const* ptr2 = arr2;
x = ptr2;   
std::cout << ptr2 << std::endl;  // 输出 "Hello"


//x[0]='h';  //非法,不能改变指针指向对象的值

const  char * const &x

        const char * const & x 表示指向常量字符的常量指针的常量引用,可以解释为:x是一个常量引用,它指向了一个常量指针,并且这个常量指针也指向一个常量字符。所以即不能修改指针的指向,也不能修改字符的值。

const char* ptr1 = "Hello";
const char* const& x = ptr1;

// 无法通过x修改字符内容
// x[0] = 'h';  // 错误,指针所指向的字符是不可修改的

std::cout << x << std::endl;  // 输出 "Hello"

//也不能修改指针指向
const char* ptr2 = "World"; 
//x = ptr2; //非法 

总结:引用是不是常量引用看,它引用的那个对象是不是常量。当遇到复杂的复合类型时可以从右往左看,比如 char* const & x:  首先x是引用,然后是const 常量引用,接着是 char* 类型的const的引用。

以上是我学习过程中积累的知识,若有疏漏之处,还请各位不吝赐教。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值