C++指针、引用的使用int&和int*

 

例: int&

这里的&不是取地址符号,而是引用符号,引用是C++对C的一个重要补充。变量的引用就是

变量的别名,讲的通俗一点就是另外一个名字,比如:“张三这个人在家里,老爸老妈叫他

三娃子,那么这个三娃子就是指张三这个人,如果叫张三去做某事,就是叫三娃子去做某事,

这两个名字指的是同一个人。”同样可以理解如果变量b是变量a的引用 那么无论a,b中任

何一个值改变,另外一个也相应的改变。

 

a)声明引用时必须指定它代表的是哪一个变量,即对它初始化。

int &a=b;这样是声明a是变量b的引用

如果是int &a;这样就是错的,没有指定a代表哪一个变量。

b)引用与其所代表的变量共享同一内存单元,系统并不为引用另外分配存储单元;

这个应该好理解;就像前面所说的,张三和三娃子都是同一个人,三娃子只是张三的别名。

因此,对于 int &a=b;这个例子来说,要输出a和b 的地址,肯定是相同的。

1. int

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void swap1(int a, int b){
 5     int tmp;
 6     tmp = a;
 7     a = b;
 8     b = tmp;
 9 }
10 int main(){
11     int a = 1;
12     int b = 2;
13     swap1(a, b);
14     cout<<"a = "<<a<<endl;
15     cout<<"b = "<<b<<endl;
16     system("pause");
17     return 0;
18 }

交换失败。这样的交换只是交换了形参的值,是无法达到交换值的效果的,这段程序很简单,不做细说。 

2. int*

#include <iostream>
using namespace std;

void swap2(int *a, int *b){
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
}

int main(){
    int a = 1;
    int b = 2;
    swap2(&a, &b);
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    system("pause");
    return 0;
}

交换成功。上面是的swap2接受的参数是地址,我们传入地址,就可以直接操作实参的值了。

3. int&

#include <iostream>
using namespace std;

void swap3(int& a, int& b){
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
}

int main(){
    int a = 1;
    int b = 2;
    swap3(a, b);    
        cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    system("pause");
    return 0;
}

交换成功。引用即别名,通过引用也是可以直接访问到实参和控制实参的。

4. int*&

#include <iostream>
 2 using namespace std;
 3 
 4 void swap5(int *&a, int *&b){
 5     int tem = *a;
 6     *a = *b;
 7     *b = tem;
 8 }
 9 
10 int main(){
11     int a = 1;
12     int b = 2;
13 
14     int *aPtr = &a;
15     int *bPtr = &b;
16     int *&arPtr = aPtr;
17     int *&brPtr = bPtr;
18 
19     swap5(arPtr, brPtr);
20 
21     cout<<"a = "<<a<<endl;
22     cout<<"b = "<<b<<endl;
23     system("pause");
24     return 0;
25 }

交换成功。这个稍微复杂一点,int*&  value这样一个声明,我们从最接近value的符号看起,是个&,说明value是一个引用,它是一个什么引用呢?再看*,它是一个指针的引用,即指针的别名,我们用*value就可以访问到实参的值了。所以,其交换函数的内部逻辑跟int *是一样的。

5. int &*

交换成功。这样定义就不合法,如果从字面上来看,我们分析一下,如int &* value,最接近value的是*,说明value是一个指针,再看前面的是&,说明是一个指针的引用,而指针是无法被引用的,所以,这样的定义是不合法的,不要记这个。

 6. int**

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void swap6(int **a, int **b){
 5     int tmp;
 6     tmp = **a;
 7     **a = **b;
 8     **b = tmp;
 9 }
10 
11 int main(){
12     int a = 1;
13     int b = 2;
14     int *aPtr = &a;//指向数据的指针
15     int *bPtr = &b;//指向数据的指针
16     int **aaPtr = &aPtr;//指向指针的地址的指针
17     int **bbPtr = &bPtr;//指向指针的地址的指针
18     swap4(aaPtr, bbPtr);
19     cout<<"a = "<<a<<endl;
20     cout<<"b = "<<b<<endl;
21     system("pause");
22     return 0;
23 }

交换成功。同样的,比如int **value, 最接近value的是*,说明value是一个指针,在前一个是*,说明是一个指向指针的指针,这样是合法的,那么如何访问value代表的实际参数的值呢?很简单,用**value就可以了,记住*是一个操作符,如同&一样,不过&是取地址操作符,而*是取值操作符。 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值