「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
1、引用(右值引用)
2、指针
指针:是指向另外一种类型的复合类型。
注意:
-
指针是一种类型,一般情况下32位程序占4个字节,64位程序占8个字节。
-
创建出来的指针本身就是一个对象,可以赋值和拷贝,若无初始化,将拥有不确定的值(地址)
定义方式如下:
int x=0;
int *p=&x;
int *p1=new int;
int *p2=new int(32);//指向int类型,值为32
int* p3 = new int[5] {1,2,3};//指针数组,分配5个int类型空间,p3指向头部
std::cout << sizeof(p1) <<" " << sizeof(p2) << " " << sizeof(p3) << std::endl;
2.1指针值
- 指向一个对象;
- 指向紧邻对象所占空间的下一个位置;
- 空指针,即没有指向任何一个对象
- 无效指针,上述三种情况的其他值,比如数组越界
注意:无效指针将会引发程序执行错误,比如
linux
的段错误,但不会引发编译报错,试图访问2和3,也不会编译报错,但会程序出错,所以一定要清楚指针所属的是上述那种类型;
利用指针访问对象
采用解引用符*来访问对象,比如*p, *p在一起,就相当于p指向的对象。注意:解引用只适合有效指针
空指针
以下三种方法初始化为空指针:
- int *p=nullptr;(C++11)
- int *p2=0;
- int *p3=NULL;
注意:
int x=0; int *pi=x;//错误,因为x是int类型,不能代表空指针,同时x就不是指针
注意:指针一定要初始化,否则一旦出错可能就是程序崩溃的事了,查找起来非常棘手
-
指针可以赋值,赋值后改变指向对象
-
指针可以当判断条件,循环条件,指针非空为true,空指针则为false
-
void* 泛化指针,可以存储任意对象的地址,一般在使用时采用强制类型转化的方法
2.2多重类型复合
int *p1,p2;//p1是指向int指针。p2是int
若想定义两个指针
要么:
int *p1,*p2;
要么:
int *p1;
int *p2;
指向指针的指针,指向指针的引用
int **p;//p为指针,指向int型指针
int *&p;//p为引用,指向int型指针
注意:要理解p到底是什么,从右往左读,距离变量最近的那个符号决定其类型,若是逗号组成的复合,则从右往左看到‘,’之前
3、类型别名
- 传统方法 : typedef 类型 类型别名 ,类型别名前的*号,跟随类型的,代表类型别名是指向类型 的指针
- C++11新方法:using 类型别名 = 类型
4、auto
5、decltype
关键字decltype将变量类型声明为表达式指定的类型。比如decltype(x) y 让y类型与新类型相同。示例:
double x;
int n;
decltype(x*n) y;//y是double类型
decltype(&x) z;//z是double *类型
decltype((x)) m;//z是double &类型
C++11新增了一种语法:在函数名和参数名后面指定返回类型,示例:
auto double(int x,double y)->decltype(x*y){
return x*y;
}