基本概念
const -> 设置变量为只读类型(常变量)
const可作用于以下类型:
第一类 一般类型
int char short double float long 等
T 为类型
此时T const 变量名和 const T 变量名相同
在初始化const T 时, 既可以用 const T 来作为右值 ,也可以用 T 作为右值
如果没有初始化,后续无法赋值,因此有些编译器会因为const 变量未初始化而报错
第二类 指针
分为一级指针和多级指针
一级指针
声明
1.T const * p;
//指向常量的指针 , 即指针的值可以变,指向的值不能通过指针改变;
2.const T *p;
//和1相同
3.T * const p;
//指向变量的指针常量 , 即指针的值不能变,指向的值可以通过指针改变;
//未初始化时编译器可能报错;
4.const * T p;
//无效声明
5.const T * const p;
//指向常量的指针常量,即指针的值和指向的值都不能改变
赋值
指向常量的指针 T const *p 可以直接 "被" T* 所赋值(隐式转换)
而 一般指针 T* p "被" 指向常量的指针T const* p 直接赋值时会报错(可以显式转换,但是不建议)
多级指针(常用的二级指针)
声明
1.const int ** p
//指向常量的二级指针 即**p不能改
2.int ** const p
//指向变量的二级指针常量 即p不能改
3.int * const * p
//指向指针常量的二级指针常量 即*p不能改
赋值
//注意
int * p;
const int ** p2 = &p;
//报错,T ** 到 const T **的转换
//而
const int *p;
const int ** p2 =& p;
//正确
//在c语言中T* 可以赋值给 const T* 而T ** 不能赋值给 const T **
第三类 数组(通过typedef)
typedef int A[1][2];
const A a = {{1,2}}; // const int* 的数组 是是是是是是是是是是
int* pi = a[0]; // 错误: a[0] 拥有 const int* 类型
//实际上就是指针 const int* 不能赋值给int*
第四类 结构体
分两种:
const 修饰结构体
整个结构体里的变量都被限制为只读
const修饰结构体的变量
该结构体的其他变量不受影响,但是结构体被限制为只读
如有错误,欢迎指正