指针与引用

指针有能力指向一块内存,它有能力指向一个地址。
引用是一个对象的别名,本身并没有开辟一块新的空间,其实质上也是一个地址。

下面介绍指针和引用的区别

(1)指针可以为空,但引用是不可以的,因此在定义一个引用时必须为其初始化,否则连编译都无法通过。

#include<iostream>
using namespace std;

int main()
{
    int a = 10;
    int& b;

    return 0;
}


可见,在使用引用时必须对其初始化,但是指针则不必,所以在使用指针时需要注意对其进行判空操作

(2)引用是不可以改变指向的,但是指针是可以的。但是引用时可以改变所指向对象的内容的,例如在对引用进行 ++ 操作时会直接改变所指对象的内容,但是对指针进行 ++ 操作时改变的是位置。

#include<iostream>
using namespace std;

int main()
{

    int i = 10;
    int& ref = i;
    ref++;
    cout << "i=" << i << endl;
    cout << "ref=" << ref << endl;

    int j = 20;
    ref = j;
    ref++;

    cout << "i=" << i << endl;
    cout << "ref=" << ref << endl;
    cout << "j=" << j << endl;

    cout << "ref的地址:"<<&ref << endl;
    cout << "i的地址  :"<<&i << endl;
    cout << "j的地址  :"<<&j << endl;
    system("pause");
    return 0;
}


分析上部分代码可以得到 ref是变量 i的一个别名,两者指向了同一块空间,可见,在定义引用时并没有单独为其开辟空间。然后分析对引用进行 ++ 操作,发现其有能力改变这块空间的内容,** ref = j;这条语句并没有重新将**ref作为j的别名,只是将j的内容赋值给了ref,通过后续的输出地址也同样可以看出这一点,可见引用时从一而终的,这与指针时不同的。

(3)在用 sizeof() 求取引用的大小时求得的是所指向变量的大小,而指针所求取的大小,时地址的大小,与类型是无关的。

#include<iostream>
using namespace std;

int main()
{
    char i = 'a';
    char& ref = i;
    char* p = &i;
    cout << "i的大小  :" << sizeof(i) << endl;
    cout << "ref的大小:" << sizeof(ref) << endl;
    cout << "p的大小  :" << sizeof(p) << endl;


    system("pause");
    return 0;
}

两者都有能力指向 i 这块空间,但引用更加的简洁和高效,在理解上也更清晰。

(4)引用对比指针的使用来说会更加安全,因为其初始化必须赋值,以及不可更改的特性,使其使用起来更加安全,其灵活性对比指针来说较小,但换取了极高的安全性。

对上述内容 简单的进行概括:
指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名,引用不改变指向。”

下面的介绍一下可以修饰指针与引用的关键字 :const

首先简单介绍下 指针常量引用常量
指针常量在定义指针语句时指针名前加const修饰,表明指针所指向的空间是不能修改的,但是指针所指向空间的内容是可以修改的。因为引用自身的特性导致其本身就是一个常量,所以无需在定义引用时在其引用名前加**cons**t修饰。

#include<iostream>
using namespace std;

int main()
{
    int a = 10;
    int* const p = &a;
    int b = 20;
    p = &b;

    system("pause");
    return 0;
}


可见 指针名在被const修饰时其变成了一个不能被修改的左值,但可通过*p对其所指向空间的内容进行修改,可自行验证 。

然后再看下常量指针常量与常量引用(引用本身就是一个常量,所以就不赘述为常量引用常量,引用名前也没必要加const修饰)

#include<iostream>
using namespace std;

int main()
{
    int a = 10;
    const int* const p = &a;
    p = &a;
    *p = 20;

    system("pause");
    return 0;
}

#include<iostream>
using namespace std;

int main()
{
    int a = 10;
    const int& ref = a;
    ref = 20;

    system("pause");
    return 0;
}

由此可见常量引用时无法被重新赋值的,它指向的空间与内容都无法被修改,一般用于对常量临时变量的引用。

以上内容就是对指针和引用的一点简单剖析,有不对或不足之处还请指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值