符号&有多种用法,这篇文章讨论其作为引用与取地址的区别。
1.&作为引用:可理解为给变量取别名
int a=6;
int &b=a;
声明了b是a的一个引用,是a的一个专属别名,故b不能再作为别的变量的引用,即不能继续有&b=c。
int &c=a; // a可以被多次引用,即被多次起别名
int &d=b; // b也可以被引用
对引用b进行赋值、运算等操作,即是对被引用的对象a进行赋值、运算操作,a对应的地址中的数值改变,但a还是a,表示的地址不变。
b--;printf("%d\n",a); //此时a=5.对引用b的操作即是对a本身的操作
b=4;printf("%d\n",a); //此时a=4,但b还是a的别名
引用时需要初始化,即引用不能为空,故有int b;,但不能有 int &b;
以swap函数实现为例阐述引用的作用。
inline void swap(int x,int y){
int t=x;
x=y;
y=t;
}
inline void swap1(int &x,int &y){
int t=x;
x=y;
y=t;
}
int main(){
swap(a,b);//未成功交换
swap1(a,b);//成功交换
}
此处等价于&x=a,&y=b。然后x与y对应的数交换,即a与b交换。
故此处的&为引用。
判断引用的方式
1.定义的时候必须初始化,即&前面有类名或类型名,&后面一定带 “=”。
2.&后面的名字是新的名字,之前不存在。故此处的函数形参也为引用。
2.&作为取地址,需与指针配合使用。
把内存中某一个地址命名为a,并放入某一数值,&a即代表该数值所在的地址
指针及其应用。
int *x;x=&a;
上式定义了一个指针x,则x的值就代表指向的地址,x代表取出指向地址中的数值。初始指针未定义指向时,默认指向NULL,故指针可以指向空。
指针指向的是地址,而不是变量名。不能写x=&a。
int *x=&a;
可以把int *看成一个类型名,代表指针,故应为x等于某个地址,即&a。
x=&b;
指针可以多次定义所指向的地址,而引用对应的地址唯一。
x++;
此时是对指针直接进行修改,改变了指针指向的地址,故*x不再指向b所在的地址中的数值。
(*x)++;
可以直接对指针指向的内容进行修改,代表指针指向的地址中的数值加1。
注意:必须要加括号,否则加一的优先级更高,会导致x指向的地址改变。
特别注意:对指针进行取值操作之前一定要判断指针是否指向NULL,而对引用操作则无需判断是否为空。
inline void swap(int *x,int *y){
int t=*x; //t是数值,不能为t=x;
*x=*y;
*y=t;
}
int main(){
swap(&a,&b);
}
//此处直接进行等于操作的话,相当于int *x=&a
inline void swap1(int *x,int *y){
int *t=x; //t是指针,不能为t=*x;
*x=*y;
*y=*t;
} //错误原因,*t与*x指向同一地址,当*x=*y后,*t也变成了*y
inline void swap2(int *x,int *y){
int *t=x;
x=y;
y=t;
} // 错误原因:只改变了两个指针的指向,并不影响地址中的数值
判断&为取地址的方式:
如果&是取址运算符,也就意味着取一个变量的地址并付给指针变量。&后面紧跟的是变量(已存在);
两种正确的swap函数的写法:
inline void swap(int &x,int &y){
int t=x;
x=y;
y=t;
}
inline void swap(int *x,int *y){
int t=*x; //t是数值,不能为t=x;
*x=*y;
*y=t;
}