const与一级指针的结合应用
我们以后给空指针都是用nullptr。因为在C++中,NULL是空指针或者0值。
const修饰的量 叫常量
和普通变量的区别是什么? C++有两点区别?
1.编译方式不同 2.不能作为左值了
C++中const修饰的量常出现的错误是:
1.常量不能再作为左值 ->不能直接修改常量的值
2.不能把常量的地址泄露给一个普通的指针或者普通的引用变量 ->不可以间接修改常量的值
这2点是C++编译器可以检测出来报错的。
我们看下面代码:
编译通不过。
那怎么转换呢?
const和一级指针的结合:有4种情况
C++的语言规范:const修饰的是离它最近的类型
const int *p = &a;
const修饰的就是int了,因为int本身就可以组成一个类型。
但是我们关心的是const修饰的是什么表达式。什么表达式不能再被赋值了。
我们把修饰的类型去掉,就是const修饰的表达式了:*p
*p就不能被赋值了。
*p被const修饰了,const修饰了指针p的指向,指向的东西不能被赋值了。
p=&b
但是指针本身可以被赋值,因为p本身没有被const修饰。
p可以任意指向不同的int类型的内存,但是不能通过指针间接修改指向的内存的值。
int const* p;
const修饰的是离它最近的类型,但是*不是类型哦,不能用 * 定义变量所以修饰的还是int。
int *const p = &a;
这个const修饰的是int *了,因为 * 自己不能作为类型,所以再往前走,就是int *了
去掉const修饰的类型,就是const修饰的表达式,就是p本身了,p本身是常量,不能被修改,但是 *p没有被const修饰,可以修改。
这个指针p现在是常量,不能再指向其它内存,但是可以通过指针解引用修改指向的内存的值。
const int *const p = &a;
前面的const修饰的类型是int,所以const修饰的表达式是*p,所以 *p不能被赋值。
后面的 const修饰的类型是int *,所以修饰的表达式是p,所以p不能被赋值。
这样*p就不能被解引用了。
下面几种写法都可以指向a:
我们看这个是什么情况?
我们先来看下面:
const如果右边没有指针*的话,const是不参与类型的!!!
const只用来表示q2是常量
总结const和指针的类型转换公式:
左值 = 右值
int* = const int* 是错误的!
const int* = int* 是可以的!
Int *q=p是错误的。const int * 不能赋值给int *
因为 const右边有 *了