const
const在c中的行为是常变量
不能定义数组的大小,因为其是一个变量
在c++中,(const int a = 4;)使用立即数初始化,那么就是一个常量,在编译阶段,会将所有的a使用10代替(const int a = 10),使用变量初始化(const int a = b)就是一个常变量,因为b的值只有在运行阶段才能知道,其行为和在c中一致,
都可以通过 int* p = (int*)&a 修改a地址的值(需要转int*, 是因为常量不能把地址暴漏给普通指针),但是对于常量来说,在编译阶段就已经被常量替换了,因此打印出来也是不变的。
int main()
{
const int a = 10;
int* p = (int*)&a;
const int b = a;
*p = 30;
printf("%d %d %d",a, *p, b);
return 0;
}
const与一二级指针:const修饰的是与其最近的类型
一级指针
int const * p;//修饰的int,是底层const
const int * p;//同上,推荐这种写法
int * const p;//修饰的int*,顶层const,!!!!p其本质还是int*,只是p不能做为左值,可以做右值赋值给int*
const int * const p;//第一个const是底层const,第二个是顶层const
二级指针
const int **q;//修饰的int ,即**q不能做左值
int * const *q;//修饰的int *,即*q不能做左值,抛去const,q是一个int**类型,加上const,即*q是一个const类型
int ** const q;//修饰的int**,即q不能做左值
int * p = nullptr;
const int** q = &p;//错误的,const int ** <= int ** 不行
//直观上感觉可以,但是不行,原因是,此时*q和p指向的同一块内存
const int b = 4;
*q = &b;//
const int* const* q = &p;//正确的
*如第四,五行,b是const int,地址交给q是可以的,因为q是一个const int !但是如果第二行的赋值成功,q指向的地址同时也被一个int所指向,那么此时就是把一个常量的地址暴漏给了普通指针
第五行正确的,因为第二行错误的原因是 q可以被一个&b赋值,如果加上const修饰int,那么此时*q,不能再被赋值
引用
- 引用和指针的区别
- 在汇编层面一样,
- 引用必须初始化,且初始化之后无法修改引用的对象
- 引用没有多级
使用引用,引用一个数组
int array[5] ={};
int (&p)[] = array;
const和引用
判断const和引用的问题,把引用转换为指针就可以了
int a = 10;
int *p = &a;
const int*&q = p;//--->const int **q = &p;