C++ 笔记——变量和基本类型(二)

1,038 阅读3分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

1、引用(右值引用)

reference(引用)

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

浅谈C++2.0新特性|8月更文挑战

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;
}