指针和引用的区别

数组的指针、引用传参

#include <iostream>
void f1(int a[])
{
    printf("%p %d\n", a, sizeof(a));
}
void f2(int a[4])
{
    printf("%p %d\n", a, sizeof(a));
}
void f3(int (&a)[4])
{
    printf("%p %d\n", a, sizeof(a));
}
int main()
{
    int a[4];
    f1(a);      //012FF9BC 4
    f2(a);      //012FF9BC 4
    f3(a);      //012FF9BC 16
    return 0;
}

上面就是一个简单的例子,第三个函数由于传进去的是数组的引用,所以可以判断出a的内存大小是16个字节,前两个函数只能判断出a是一个地址,判断出来的的都是a这个指针所占内存的大小,指针所占内存大小一般都是4或者8个字节,取决于系统内存最大寻址大小,即32位操作系统一般指针为4个字节,64位操作系统一般指针为8个字节。

指针和引用的区别

引用是别名,指针是地址。
1、引用必须被初始化,指针可以不被初始化。
2、引用必须绑定,指针可以不指向任何地址。
3、指针和引用的自增自减运算意义不一样(对引用本身进行操作将反馈到引用的值上,对指针本身的操作只是改变了指针的值,对指针指向的地址的值没有影响)。
4、"sizeof引用"得到的是所指向的变量(对象)所占内存的大小,而"sizeof指针"得到的是指针本身所占内存的大小。

const与指针

int a = 4;
const int* p1 = &a;
int const* p2 = &a;
int* const p3 = &a;
const int* const p4 = &a;

p1和p2是一样的,表示不可通过该指针改变该指针指向的内存地址对象的值。
p3则是表示指针本身的值不可被改变,即不能再指向别的变量。
p4则既不可通过该指针改变该指针指向的内存地址对象的值,也不能再指向别的变量。

返回引用、右值引用

引用和const引用传递返回的都是栈里面变量的地址,右值引用返回后会创建一片新的内存。

#include <iostream>
#include <cstdio>
using namespace std;

int fun1()
{
    int a = 10;
    printf("fun1 %d %p\n", a, &a);
    return a;
}
int& fun2()
{
    int a = 10;
    printf("fun2 %d %p\n", a, &a);
    return a;
}
const int& fun3()
{
    int a = 10;
    printf("fun3 %d %p\n", a, &a);
    return a;
}

int main()
{
    int a1 = fun1();
    ++a1;
    printf("main %d %p\n", a1, &a1);

    int& a2 = fun2();
    ++a2;
    printf("main %d %p\n", a2, &a2);

    const int& a3 = fun3();
    a3;
    printf("main %d %p\n", a3, &a3);

    int&& a4 = fun1();
    ++a4;
    printf("main %d %p\n", a4, &a4);

    return 0;
}

fun1 10 006FFA08
main 11 006FFB1C
fun2 10 006FFA08
main 11 006FFA08
fun3 10 006FFA08
main 10 006FFA08
fun1 10 006FFA08
main 11 006FFAEC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值