指针
通常难以理解;
最重要的两个符号:取地址符(&)以及解引用符(*);
这两种符号在不同的语义下具有不同的解释:
例如:
int i=43;
int &r= i; //需要注意这个取地址符属于声明的一部分,这句代码表示r是i的另一个名称,不是简单的赋值,r的改变也会影响到i的值;
int *p; //这个解引用符同样属于声明的一部分,p表示一个指针;
p=&i; //表示p指向i,p是i的地址;
*p=i; //给p指向的变量进行赋值;
int &r2=*p; //r2是p指向变量的另一个名称,这里p指向了i所以r2就是i;
弄明白这两点之后就没有什么难懂的;
还有空指针,可以有几种形式:
int *p=0;
int *p=nullptr;
int *p=NULL;
还有一种是指向指针的指针:
int i=0;
int *p=&i;
int **q=p;//q指向的变量是p,也就是说*q=p,**q=i;
const限定符,常量
const int i=5; //正确
const int j; //错误,未初始化
i=6; //错误,想要改变常量值
//i这个常量有两个点需要注意:1是常量i在声明的时候就必须初始化,2是改变常量变量的值;
const int &r=i; //正确
int &t=i; //错误
//对于常量的引用,只有常量可以引用常量,普通变量不能够引用常量
int i=1;
int j=2;
const int* p=&i;
*p =2; //错误,p指向一个常量变量,不能改变;
p =&j; //正确,虽然不能通过p来改变p所指向的值,但是可以改变p指向的变量;
int* const p=&i;
*p= 2;//合法,p所指向的并不是一个常量,所以可以通过p修改p所指向的变量
p=&j;//错误,p是一个常量不可以更改;
const int* const p=&i;
*p = 2;//错误;
p=&j; //错误
auto类型说明符
c++11中引入了auto说明符,让编译器代替我们分析表达式的类型;
auto it =nums[0];//编译器根据nums[0]的类型,推断出it的类型