char c; //字符
char *p=&c; //指针
char &r=c; //引用,在定义时需要有初始值(变量或者是可以做左值的东西),定义时必须初始化
//r是c的别名
//作为参数表或者成员变量可以没有初始值,但是本地变量或者全局变量必须有初始值
int x=47;
int &y=x;
cout<<"y="<<y; //y=47
y=18;
cout<<"x="x; //x=18
int x=3;
int &y=x;
const int &z=x;//z是x的别名,但是通过z不能修改x,但是x可以改变,z不能做左值,可以改变x,变完x,z相应的也就变了
void f(int& x);
f(y);
//在f(int& x)里对x进行修改,y就改变了
int &y=x;
y=12;//对
void func(int &);
func(i*3); //错误,i*3没有地址存放,会报错
int* f(int* x){
(*x)++;
return x; //正确
}
int& g(int& x){
x++;
return x; //正确
}
//int g(int x){...} 编译会报错,调用时都一样,无法重载
int x;//全局变量
int& h(){
int q;
return q;//q是本地变量,报错
//指针返回本地变量地址也会报错
return x;//正确,x是全局变量
}
int main(){
int a=0;
f(&a);//a=1
g(a);//a=2
h()=16;//h()返回的是引用,可以做左值,放在左边,接受赋值,实际上是x变为16
*k()=10;
}
-
引用不可以为null;指针可以为null
-
引用依赖于绑定的初始值,不可以改变;指针可以更改指向的值
-
引用依赖于已经存在的变量;指针独立于已经存在的对象
引用是基于const 指针实现的,引用引用原因:美观
引用的实质是指针。
引用不能做引用之间的赋值。
int x;
int &a=x;
int &b=a;//报错
int &b=x;//正确
int x;
int y;
int &a=x;
int &b=y;
b=a;//实际上是y=x;
-
引用不能绑定引用
-
不能指针指向引用,但是引用可以绑定指针
int&* p;//错误
void f(int* &p;)//正确
-
数组中不能使用引用,reference不是实体,没有reference的数组