指针和引用
1概念:从c的角度上分析,指针和引用在本质上是一 样,但是在c++中推荐使用引用
通过引用和指针都可以改变函数的参数,但是在c++中使用引用可以减少函数的开销,
注意1:函数的引用中主意函数上下的类型一致
本此重点分析引用
1>引用即别名, 类型&引用名=变量名
2>常引用 (万能引用) const
3>注意关注函数的左值,右值:函数赋值 左加加 左减减
int func(void){
int a=100;
return ;//返回值是一个右值,是由系统自行处理的
}
func()=200;//error 因为常数做了左值
这个时候加上(const)就可以避免实参的修改,而且const可以进行左值和右值的转换
2:引用型函数的返回值
1>可以将函数的返回值声明为引用,避免返回值带来的开销
2>一个函数的返回值类型被声明为引用,那么函数的返回值可以是一个左值
3>为了避免函数外部函数的修改被引用的目标,可以加上const常属性
eg:const int &fun(void)//可以进行引用但是代码可读性差
int foo(void){
static int a=100;
return a;//返回值是一个右值,最后内存空间会被释放
}
int main(){
foo()=200;//error 返回值是一个右值
}
/*尽量不使用返回局部变量的引用,因为引用的局部变量的内存会在函数返回的时
被释放*/
但是当返回的是静态变量,全局变量,成员变量,他们的内存分配不会被释放
3:引用和指针的比较
3.1 本质分析:
int d=1;
int &r=d;//引用
int *const a=&d;//指针
r<==>*a
注意:引用的本质就是指针
3.2 指针的定义不做初始化,但是引用必须进行初始化(指针常量除外)
初始化的指针仍然是可以进行改变的
eg: int a=3,b=10;
int *m;
int &r;
m= &a;
m= &b;
int &r=a;
r=b;//不是修改引用的目标,而是对r进行赋值。间接的就会改变ad的值
3.3 可以定义指针的指针,不可以定义引用的指针
int a=100;
int *b;
int **r=&b;//二级指针
int &m=r;
int &*rq=&m;//error 引用指针是错误的 引用是实际不分地址的
3.4 可以定义指针的引用
int a=100;
int *m=&a;
int*&ra=&a<==>int *&ra=m;//指针的引用
int &r=a;
int &&ra=r;//错误的 &ra是右值(常量)对常量的引用是违规的
int &rm=r;这个就是起一个别名
3.5 可以指针数组,但是不可以进行引用数组,但是可以定义数组的引用
int a=1,b=2,c=3;
int *arr[3]={&a,&b,&c};//指针数组
int &arr[3]={a,b,c};//error
int arr[3]={1,2,3};
int (&rarr)=arr;//rarr称为数组引用
3.6 和指针函数一样,也允许函数的引用,语法和指针是一样的
void foo(int a,int b)
int main(){
void (*pfoo)(int ,int)=func;
pfoo(10.20);
//定义和使用函数引用
void (&rfunc)(int ,int )=func;
rfunc(10,20);
}
1概念:从c的角度上分析,指针和引用在本质上是一 样,但是在c++中推荐使用引用
通过引用和指针都可以改变函数的参数,但是在c++中使用引用可以减少函数的开销,
实参的值在函数的引用过程中可以进行改变。
也可以理解引用某种意义上是安全的指针。
本此重点分析引用
1>引用即别名, 类型&引用名=变量名
2>常引用 (万能引用) const
3>注意关注函数的左值,右值:函数赋值 左加加 左减减
int func(void){
int a=100;
return ;//返回值是一个右值,是由系统自行处理的
}
func()=200;//error 因为常数做了左值
这个时候加上(const)就可以避免实参的修改,而且const可以进行左值和右值的转换
2:引用型函数的返回值
1>可以将函数的返回值声明为引用,避免返回值带来的开销
2>一个函数的返回值类型被声明为引用,那么函数的返回值可以是一个左值
3>为了避免函数外部函数的修改被引用的目标,可以加上const常属性
eg:const int &fun(void)//可以进行引用但是代码可读性差
int foo(void){
static int a=100;
return a;//返回值是一个右值,最后内存空间会被释放
}
int main(){
foo()=200;//error 返回值是一个右值
}
/*尽量不使用返回局部变量的引用,因为引用的局部变量的内存会在函数返回的时
被释放*/
但是当返回的是静态变量,全局变量,成员变量,他们的内存分配不会被释放
3:引用和指针的比较
3.1 本质分析:
int d=1;
int &r=d;//引用
int *const a=&d;//指针
r<==>*a
注意:引用的本质就是指针
3.2 指针的定义不做初始化,但是引用必须进行初始化(指针常量除外)
初始化的指针仍然是可以进行改变的
eg: int a=3,b=10;
int *m;
int &r;
m= &a;
m= &b;
int &r=a;
r=b;//不是修改引用的目标,而是对r进行赋值。间接的就会改变ad的值
3.3 可以定义指针的指针,不可以定义引用的指针
int a=100;
int *b;
int **r=&b;//二级指针
int &m=r;
int &*rq=&m;//error 引用指针是错误的 引用是实际不分地址的
3.4 可以定义指针的引用
int a=100;
int *m=&a;
int*&ra=&a<==>int *&ra=m;//指针的引用
int &r=a;
int &&ra=r;//错误的 &ra是右值(常量)对常量的引用是违规的
int &rm=r;这个就是起一个别名
3.5 可以指针数组,但是不可以进行引用数组,但是可以定义数组的引用
int a=1,b=2,c=3;
int *arr[3]={&a,&b,&c};//指针数组
int &arr[3]={a,b,c};//error
int arr[3]={1,2,3};
int (&rarr)=arr;//rarr称为数组引用
3.6 和指针函数一样,也允许函数的引用,语法和指针是一样的
void foo(int a,int b)
int main(){
void (*pfoo)(int ,int)=func;
pfoo(10.20);
//定义和使用函数引用
void (&rfunc)(int ,int )=func;
rfunc(10,20);
}