引用和指针的区别

  1. 指针是一个实体,需要分配内存空间。引用只是变量的别名,不需要分配内存空间。
  2. 引用在定义的时候必须进行初始化,并且不能够改变。指针在定义的时候不一定要初始化,并且指向的空间可变。(注:不能有引用的值为NULL)
  3. 多级指针,但是没有多级引用,只能有一级引用。
  4. 指针和引用的自增运算结果不一样。(指针是指向下一个空间,引用是引用的变量值加1)
  5. sizeof 引用得到的是所指向的变量(对象)的大小,而sizeof 指针得到的是指针本身的大小。
  6. 引用访问一个变量是直接访问,而指针访问一个变量是间接访问。
  7. 使用指针前最好做类型检查,防止野指针的出现;
  8. 引用底层是通过指针常量(int *const a)实现的,所以引用占用的内存空间的大小同指针是一样的。只不过编译器在内部隐藏了取地址和*(解引用)操作。
  9. 作为参数时也不同,传指针的实质是传值,传递的值是指针的地址;传引用的实质是传地址,传递的是变量的地址。

从汇编层去解释一下引用

         9:                int x = 1;

         00401048    mov         dword ptr [ebp-4],1

         10:               int &b = x;

         0040104F    lea         eax,[ebp-4]

         00401052    mov         dword ptr [ebp-8],eax

x的地址为ebp-4,b的地址为ebp-8,因为栈内的变量内存是从高往低进行分配的。所以b的地址比x的低。lea eax,[ebp-4]  这条语句将x的地址ebp-4放入eax寄存器mov dword ptr [ebp-8],eax 这条语句将eax的值放入b的地址ebp-8中上面两条汇编的作用即:将x的地址存入变量b中,这不和将某个变量的地址存入指针变量是一样的吗?所以从汇编层次来看,可以看出引用是通过指针来实现的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的引用指针有一些区别。下面是它们的主要区别: 1. 语法区别:在C语言中,引用使用&符号来获取变量的地址,而指针使用*符号来声明指针变量和解引用指针。 例如: ```c int num = 10; int *p = # // 使用指针获取变量的地址 int &ref = num; // 使用引用获取变量的地址 ``` 2. 操作区别:通过指针可以进行指针运算和修改指针所指向的,而引用只能在创建绑定到一个对象,之后无法改变绑定的对象。 例如: ```c int num = 10; int *p = # int &ref = num; *p = 20; // 修改指针所指向的 ref = 30; // 修改引用所绑定的 p++; // 指针运算 // ref++; // 错误,引用无法修改绑定对象 ``` 3. 空指针和野指针指针可以具有空(NULL),即未指向任何有效对象。而引用必须始终引用一个有效对象,没有空引用的概念。 例如: ```c int *p = NULL; // 空指针 // int &ref; // 错误,引用必须初始化绑定到一个对象 ``` 4. 传递方式:通过指针传递参数,可以修改原始数据。而通过引用传递参数,可以直接修改原始数据,但不能重新绑定到其他对象。 例如: ```c void modifyByPointer(int *p) { *p = 100; } void modifyByReference(int &ref) { ref = 200; } int num = 10; modifyByPointer(&num); // 通过指针修改原始数据 modifyByReference(num); // 通过引用修改原始数据 ``` 总体而言,指针提供了更多的灵活性和功能,可以进行指针运算和动态内存分配等操作。而引用更加简洁、直观,适用于简单的传递参数和别名的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值