首页 > 其他分享 >引用和指针的区别

引用和指针的区别

时间:2023-03-27 20:19:20浏览次数:35  
标签:初始化 区别 int 合法 引用 NULL 指针

1、定义和性质不同

1、指针是一个变量,存储的地址,指向内存单元

2、引用是变量的别名,跟原始变量是同一块内存

int a = 10;
int *p = &a; // p是指针, &在此是取地址运算 
int &r = a; // r是引用, &在此起标识作用

2、指针可以不初始化,引用必须初始化

int* ptr;  //正确
int& ref;  //error:引用变量"ref"需要初始值设定项 

3、指针可以有多级,引用只能是一级

int **p; // 合法
int &&a; // 不合法

4、指针可以指向NULL,引用不可以为NULL

int *p = NULL; // 合法
int &r = NULL; // 不合法

5、指针初始化之后可以再改变指向,引用不可以

int a = 996;
int *p = &a; // 初始化, p 是 a 的地址
int &r = a; // 初始化, r 是 a 的引用

int b = 885;
p = &b;    // 合法, p 更改为 b 的地址
r = b;     // 不合法, r 不可以再变

6、sizeof 的运算结果不同

int a = 996;
int *p = &a;
int &r = a;

cout << sizeof(p); // 返回 int* 类型的大小
cout << sizeof(r); // 返回 int 类型的大小

7、自增运算意义不同

int a = 996;
int *p = &a;
int &r = a;

p++;  指向下一块地址
r++; 相当于a++

8、指针和引用作为函数参数时,指针需要检查是否为空,引用不需要

void fun_p(int *p)
{
    // 需要检查P是否为空
    if (p == NULL) 
    {
        // do something
    }
}

void fun_r(int &r)
{
    // 不需要检查r
    // do something
}

 

标签:初始化,区别,int,合法,引用,NULL,指针
From: https://www.cnblogs.com/wanglongjiang/p/17262663.html

相关文章

  • 函数指针
    函数指针的几种用法#include<iostream>#include<vector>usingnamespacestd;voidadd(inta,intb){cout<<a+b<<"";}voidForEach(constvector<int>&n......
  • C++11之智能指针shared_ptr
    在C++开发中,我们经常会遇到程序运行中突然崩溃、程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的。C++11新标准中,增添了uni......
  • git reset, git checkout, git revert 区别 (译)
    题记:团队中大多数成员使用sourceTree和github两款git工具,然而大家对于图形化工具提供的reset,checkout,revert功能点并不是很了解,甚至于混淆,然后凭借猜测去使用。......
  • 引用
    一、引用的基本概念引用变量是C++新增的符合类型。引用时已定义的变量名。引用的主要用途是作用函数的形参和返回值。声明/创建引用的语法:数据类型&......
  • toString()、String.valueOf、(String)强转,有啥区别?
    toString(),可能会抛空指针异常这种使用方法中,因为java.lang.Object类里已有public方法.toString(),所以java对象都可以调用此方法。但在使用时要注意,必须保证object不是nul......
  • C#中抽象方法与虚方法的区别详解及示例
    1.抽象方法与虚方法的区别  先说两者最大的区别:抽象方法是需要子类去实现的。虚方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求。因为抽象类无法实例化,所以......
  • C#中重写(override)及覆盖(new)的区别详解
    1.重写和覆盖的定义1.1重写(override)的定义  在C#中,用override关键字来重写一个父类中的虚方法或抽象方法。override关键字用于指示编译器,我要用派生类中的一个方法......
  • 线程和进程的区别【Android面试送命题】
    这道题面试出现的概率是百分之70下面我来讲下如何回答1,进程是资源管理的最小单位,线程是程序执行的最小单位2,每个进程都有自己的数据段代码段和堆栈段。线程通常叫做轻型......
  • webpack中loader和plugin的区别
    从功能作用的角度区分:1、loader:loader从字面的意思理解,是加载的意思。由于webpack本身只能打包commonjs规范的js文件,所以,针对css,图片等格式的文件没法打包......
  • 调制解调与编码解码的区别
    调制解调与编码解码的区别来源  https://www.zhihu.com/question/53226924 两个不一样啊,编码解码是对于信号本身的处理,比如我把我前面的话转成拼音然后倒起来......