C++复合类型
**引用(&):**是为对象起的另外一个名字,引用必须被初始化,一个引用只能对应一个对象
int m = 10;
int &n = m;
int &n2; //错误,引用必须被初始化
n = 3; //此处实际是把3赋给了m
int p = n; //与 p = m等价
int &n3 = 5;//错误,引用类型必须是一个对象
//引用类型要和对象的类型一样
指针(*)
int m = 10;
int *p = &m; //p存放着变量m的地址
cout<<*p; //输出的是m的值10
*p = 0; //此时m的值被改变,变成0
指针值
1.指向一个对象
2.指向紧邻对象所占空间的下一位置
3.空指针
4.无效指针
//空指针
int *p1 = nullptr;
int *p2 = 0;
int *p3 = null;
//指针可以初始化也可以不初始化,但建议对指针进行初始化,以避免出现一些无法预计的错误
**void *指针:**可以存放任意对象地址
int m = 3,*q = &m;
void *p = &m; //正确
p = q; //正确
//一个弊端是你并不知道该指针是什么类型,容易出错
指向指针的引用
int i = 10;
int *p;
int *&q = p; //q是指针p的别名
q = &i; //也就是p指向了i
const限定符
用来定义一个不可改变的值,因为不可改变所以要进行初始化
const int i = 10;
i = 20; //错误,i是一个常量不可被修改
const int m = sum(); //正确,运行时初始化
const int n = 10; //正确,编译时初始化
const int j; //错误,没有初始化
int k = 20;
const int y = k; //正确
默认条件const对象仅在文件内有效,如果想在多个文件之间进行共享,必须在变量定义之前添加extern关键字
//file1.cc定义并初始化一个常量,该常量能被其他文件访问
extern const int m = 10;
//file1.h添加头文件
extern const int m; //与file1.cc中的m是同一个
**constexpr 变量:**constexpr类型以便由编译器来验证变量的值是否是一个常量表达式
const的引用
const int i = 40;
const int &l = i; //正确,都是常量
l = 10; //错误,l是对常量的引用不能被修改
int &m = i;//错误,非常量无法指向常量
int n = 10;
const int &p1 = n; //正确,不能通过p1修改n的值
const int &p2 = 10; //正确
const int &p3 = p1 * 3; //正确
int &p4 = p1 * 2; //错误
指针常量与常量指针
指针常量
const int m = 3; //m是一个常量,不能被改变
int n = 10;
int *p = &m; //错误,p是一个普通指针,不能指向常量m
const int *p1 = &m ; //正确,因为p1是常量指针,可以指向常量与非常量
p1 = &n; //正确,但是不能通过*p1更改n的值,只能存放n的地址
//还有一点是指针类型必须和所指对象类型一致
常量指针:必须被初始化,而且一旦初始化完成,则它的值(存放的地址)不可被改变
int m = 10;
int n = 2;
int *const p = &m; //正确
p = &n; //错误,因为p被const修饰,是一个常量,存放的是m的地址,不允许被更改
*p = 3; //正确,因为*P没被const修饰,所以可以更改,此时m的值被更改为3
const int m = 10;
int *const p = &m; //错误
const int *const q = &m; //正确,q是一个指向常量对象的常量指针
符合类型从右向左读,从变量名称最近的地方开始解读符号和关键字对其的影响,如int *const p,关键字const只修饰了p,也就是说p是一个常量对象,在前边是一个 * 表示p是常量指针,最后是int表示是什么类型的
指针本身是一个常量但并不意味着不能通过指针修改所指对象的值,能否这样做还取决于所指对象的类型
以上是从c++ prime一书中得到,可能与其他有所差别,仅供参考,还请各位大佬指出错误与不当之处