c++中指针和引用、指针调用和引用调用、二级指针和指针引用

指针和引用:

指针是一个变量,其值为另一个变量的地址。引用则可以看做是一个变量的别名。

#include <iostream>
using namespace std;
int main() {
    int a = 1;
    int *p = &a;
    cout << "a: " << a << endl;
    cout << "&a: " << &a << endl;
    cout << "p: " << p << endl;
    cout << "*P: " << *p << endl;
    return 0;
}


运行输出结果:
a: 1
&a: 0x7fff8e9e86a4
p: 0x7fff8e9e86a4
*P: 1

指针调用和引用调用:

首先来看一段示例代码:

#include <iostream>
using namespace std;
void change_value(int a);
int main() {
    int a = 1;
    cout << "a: " << a << endl;
    change_value(a);
    cout << "a: " << a << endl;
    return 0;
}
void change_value(int a) {
    a = 0;
}

运行输出结果为:
a: 1
a: 1

可以看到我们想要实现的功能是改变变量的值,但是实际上并没有达到我们想要的效果。这种情况属于函数参数中的传值调用,该方法把参数的实际值复制给函数的形式参数,修改函数内的形式参数对实际参数没有影响。另外两种便是指针调用和引用调用:指针调用把参数的地址复制给形式参数,在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数;引用调用把参数的引用复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。那么既然这两种方式都能改变实际参数的值,我们该选用哪一种呢?一般情况下,应该使用引用而不是指针,引用可以让程序更简洁并易于理解。此外,引用比指针安全:不可能存在无效的引用,也不需要显式的解除引用。对象的引用甚至可以像指针那样支持多态性。只有在需要改变所指地址的时候,才需要指针。例如:当动态分配内存的时候,应该将结果存储在指针而不是引用中。示例代码如下:

#include <iostream>
using namespace std;
void change_value_1(int *a);
void change_value_2(int &a);
int main() {
    int i = 1;
    int *a = &i;
    int &b = i;
    cout << "i: " << i << endl;
    change_value_1(a);
    cout << "i: " << i << endl;
    change_value_2(b);
    cout << "i: " << i << endl;
    return 0;
}
void change_value_1(int *a) {
    *a = 0;
}
void change_value_2(int &a) {
    a = 2;
}

运行输出结果为:
i: 1
i: 0
i: 2

二级指针和指针引用:

上面我们已经说到指针和引用可以改变实际参数的值,那么假如我们现在想改变指针变量的值即改变指针的指向怎么办呢?用到的则是二级指针和指针引用。下面看一段代码,实现的功能是交换两个指针变量的指向:

#include <iostream>
using namespace std;
void swap_1(int **a, int **b);
void swap_2(int *&a, int *&b);
int main() {
    int a = 1;
    int b = 2;
    int *c = &a;
    int *d = &b;
    int **e = &c;
    int **f = &d;
    int *&g = c;
    int *&h = d;
    cout << "*c: " << *c << endl;
    cout << "*d: " << *d << endl;
    swap_1(e, f);
    cout << "*c: " << *c << endl;
    cout << "*d: " << *d << endl;   
    swap_2(g, h);
    cout << "*c: " << *c << endl;
    cout << "*d: " << *d << endl; 
    return 0;
}
void swap_1(int **a, int **b) {
    int *temp = *a;
    *a = *b;
    *b = temp;
}
void swap_2(int *&a, int *&b) {
    int *temp = a;
    a = b;
    b = temp;
}

运行输出结果:
*c: 1
*d: 2
*c: 2
*d: 1
*c: 1
*d: 2

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值