网上的常量指针和指针常量很容易混淆,这里推荐一篇文章,讲的特别好
1、指向常量的指针 const int *p = &a;
在定义指针变量的时候,数据类型前用const修饰
// 定义
int a = 10;
const int *p = &a;
这里就是 这个指针的指向的变量 可以 通过指针改变,但是指针指向的变量的值 不可以 通过指针改变
// 举例
#include "stdio.h"
int main(){
int a = 10, c = 30;
const int *p = &a; // 常量指针
// 指针p 指向 a
// 修改 指针的指向 (可以)
p = &c;
// 修改 指针指向的变量的值 (不可以)
*p = 30; // 这里是会编译报错的
return 0;
}
2、本身是常量的指针 int* const p = &a;
本质上这是一个常量,是由指针来修饰的
// 定义
int a=10;
int * const p = &a;
这里就是 指针的 指向 不可以 通过指针改变,但是指针指向的变量的值 可以 通过指针改变
#include "stdio.h"'
int main(){
int a = 10, c = 30;
int * const p = &a; // 指针常量
// 指针p 指向 a
// 修改 指针指向变量的值 (可以)
*p = 50;
// 修改 指针的指向(不可以)
p = &c; // 不可以,这里是会编译报错的
return 0;
}
3、引用
引用只是对指针进行了简单的封装,底层依然是通过指针实现的
引用必须在定义的同时进行初始化,并且以后也要从一而终,不能在引用其它数据
int a = 10;
int &b = a; // 引用
// 其实就相当于
int * const b = &a;
引用和 const
-
指向常量的引用(reference to const)
const int &b = a;
-
没有 const reference,因为引用只是对象的别名,引用不是对象,不能用 const 修饰
// 错误 int & const b = a;
因为 b 本来就不能改变指向,加上 const 是多此一举。