首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++ 语言】引用 ( 引用简介 | 指针常量 | 常量指针 | 常引用 | 引用参数 | 引用 指针 对比 )

引用 地址 内存 分析 ---- int a = 0; int &b = a; 变量 与其 引用地址相同 : 对 变量 a 和 引用 b 取地址操作 , &a 与 &b 的值是相等的 ; ( 引用名称...; 这里注意 , 不同通过引用进行修改 , 但是可以通过变量名称 a 进行修改 ; ⑤ 作用及意义 : 使用 引用数据类型 作为 函数参数 , 如果不需要在 函数中 修改该引用变量的值 ( 指针指向的数据的值...语言中 , 如果要让函数的参数可以将结果返回 , 则必须使用指针作为参数 ; C++ 中的引用参数 : C++ 在 C 语言基础上扩展了 引用 数据类型 , 使用引用可以替代上面的指针作为参数的情况 ,...使参数具有返回结果的能力 ; 作用及意义 : ① 具有返回值能力 : 使用引用作参数 , 可以将参数当做返回值使用 ; ② 提高参数传递效率 : 大型对象作参数时 , 使用引用类型 , 可以提高参数传递效率...引用 与 指针 对比 ---- 引用与指针的相同点 : 都具有地址的概念 ; ① 指针 : 指针指向内存中的一块空间 , 指针变量的内容是一个内存地址 ; ② 引用 : 引用是变量的别名 , 即某块内存空间的别名

1.2K10

指针、引用和常量的一些“故事”

C++也算是学了有些年头,可惜还是不甚了解,这不,今天对于指针、引用和常量这三个在C++中处处可见的东西又有些懵里懵懂了,也罢,今天就稍稍学究一下,再尽力整理一番其中的一些“故事”吧,一则帮助自己记忆...常量指针:常量“的”指针,指向常量的指针,所指内容是不能更改的(read-only),但指针本身是可以修改的    示例:const Object* objPtr、const int *iPtr   2...指针常量:指针“的”常量,即本身为常量的指针,所指向内容是可以修改的,但指针本身是不可以修改的   示例:Object* const objPtr、int * const iPtr   3. ...引用本身即带有常量语义(类似int& const 的代码表述会引起编译错误),即你无法改变一个已经赋值的引用本身,类似的赋值操作所改变的仅是引用所引用(指向)的数据,并不改变引用本身,所以引用非常类似指针常量...对于一般数据类型(基本类型和自定义类型)而言,const的位置并不影响其的常量语义,例如const int 和 int const 都表示该int数据为常量,没有区别。   7.

60010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】C++ 引用详解 ② ( 引用的意义 | 引用本质分析 | 引用的常量特征 | 引用所占内存空间与指针相同 | 引用在 C++ 编译器实现 | 引用编译时会自动翻译为常量指针 )

    使用 指针符号 * 访问数据 ; 2、引用与指针对比 引用 与 指针示例 : 下面的两个函数 , 分别使用 指针 和 引用 作为参数 , 二者实现了相同的功能 , 性能也相同 ; 但是使用引用 , 可以像操作变量一样操作外部元素...引用 具有 " 常量 " 的特征 ; 上述 int& b = a; 代码 , 如果使用 C 语言表达 , 就是 int* const b = &a; 定义的是一个指针常量 , 该指针是常量 , 指针本身...---- 1、C++ 引用是常量指针 综合上述引用的特征 : 引用具有常量的特征 , 是一个常量 ; 引用和变量都是相同的内存空间的别名 , 其地址都指向内存空间 ; 引用本身也占用内存空间 , 占用大小与指针相同...在向 void swap(int* a, int* b) 函数 , 传入参数时 , 如果是 指针做参数 , 传入的参数必须是地址 , 需要开发者手动使用 取地址符 & 获取变量地址 , 传递给 函数..., 需要满足如下三个条件 : 函数中定义 指针类型 的 形参 , 调用函数时 修改函数外的 实参 ; 将 实参 取地址 , 传递给 函数 ; 在函数中 , 通过指针修改 实参的值 , 以达到修改外部变量的效果

    38720

    指针和引用的区别

    最后输出是: 1234567890 hello 指针和引用主要区别 1 在C++中,指针和引用经常用于函数的参数传递, 然而,指传递参数和引用传递参数是有本质上的不同的...无论你传值还是传指针,函数都会生成一个临时变量, 但传引用时,不会生成临时变量, 当你传值时,只可以引用值而不可以改变值, 但传值引用时,可以改变值, 当你传指针时,只可以改变指针所指的内容, 不可以改变指针本身..., 但传指针引用时,即可以改变指针所指的内容, 又可以改变指针本身,但传引用主要是它不生成临时变量, 不进行返回值copy等,速度快。...2 在定义区别:例如 指针++ 和引用++ 概念是不一样的 Q 指针和引用各自适用场景是什么?...A: 引用 就是变量 指针分为 指针本身和指针指向对象 如果你想修改指针本身就需要用引用 例如char* &p :修改char* 变量指向地址 的地址 int main(int argc

    73470

    nim的引用和指针

    nim语言的引用和其他语言的指针有点相似 可以提供一种“多对一”的关系 这就意味着不同的引用可以指向同一个内存位置 nim区分可被追踪的引用和不可被追踪的引用 不可被追踪的引用又称为指针 可被追踪的引用可以被垃圾回收器回收...不可被追踪的引用指向手动分配的对象,或其他地方创建出来的一块内存区域 这也就是说,不可被追踪的引用是不安全的 对于某些底层操作,不可被追踪的引用有其存在的必要 可被追踪的引用使用ref关键字定义, 不可被追踪的引用使用...var   n: Node new(n) n.data = 9 在上面的代码中,不需要写成n[].data, 因为方括号操作符已经隐式执行了 事实上nim官方也强烈不建议写成n[].data 另外,自动解引用操作也直接作用于一个方法的调用...Node = ref object     le, ri: Node     data: int 可以使用内置的new方法为一个可被追踪的对象分配内存 可以使用alloc、dealloc和realloc...size alloc0方法创建一个没有类型的指针 cast方法可以绕过类型系统,让指针具有类型ptr Data 只有在非常必要的时候再用cast方法,因为他会破坏类型安全,导致不可预知的BUG

    93950

    函数入参使用指针和引用的区别

    最近做一个工具,在整改函数时需要给一个全局变量赋值 RadixNode *g_pstRootBase 赋值的来源为已定义的结构体:TreeSet treeSet = {0}中的trSet->tNameSet...的地址赋值给g_pstRootBase(函数有删减) 传参方式为:setTreeName(&trSet, &g_pstRootBase),内部处理如下 int setTreeName(TreeSet *...,即g_pstRootBase仍然是初始值 分析一下才发现&g_pstRootBase的意思是的g_pstRootBase地址,并不是一个真正的指针变量,可以认为就是一个地址常数!...修改函数中对g_pstRootBase的赋值方式如下: int setTreeName(TreeSet *trSet, RadixNode **tName) { *tName = (RadixNode...:尽量少用引用作为左值,如果需要通过函数参数来赋值(出参),最好使用临时指针变量来获取地址,再赋值给需要的变量

    75420

    C++ 引用与引用作为函数的参数

    (有一个例外,引用作为函数参数时,不需要初始化) (2)在声明一个引用后,不能再使之作为另一变量的引用。 (3)不能建立引用数组。...引用的作用: C++加入了在C语言的基础加入了引用机制,那么引用到底有什么用呢?不会只是为了给函数起一个小名吧?显然不是,引用最用要的意义在于作为函数的参数,以扩充函数传递参数的能力。它是如何实现的?...这要从C语言参数传递开始说起: 我们知道,C语言在调用函数时,传参主要有两种形式: (1)变量名作为实参和形参 这种方式传给形参的是变量的值,传递是单向的。...(2)传递变量的地址 该方式形参是指针变量,实参是一个变量的地址,调用函数时,形参得到的实参变量的地址,因此指向实参的变量单元。...13行,定义的函数的形参是指针,在第6行,调用的函数是传入的函数实参是变量的地址,实现了i和j的交换,但是这种方法不够直观,而且依旧是“值传递”的方式,只不过传递的是变量的地址而已。

    2.2K40

    C++ const常量对象、常量成员函数和常引用

    这里有两个需要注意的点: 在常量成员函数中不能修改成员变量的值(静态成员变量除外); 也不能调用同类的 非 常量成员函数(静态成员函数除外)。...obj.GetValue; // OK,常量对象上可以执行常量成员函数 return 0; } ---- — 3 — 常量成员函数重载 两个成员函数,名字和参数表都一样,但是一个是...对象作为函数的参数时,生产该对象参数是需要调用复制构造函数的,这样效率就比较低。用指针作为参数,代码又不好看,如何解决呢?...可以用对象的引用作为参数,防止引发复制构造函数,如: class Sample { ... }; void Func(Sample & o) // 对象的引用作为参数 { ... }...但是有个问题,对象引用作为函数的参数有一定的风险性,若函数中不小心修改了形参 o,则实参也会跟着变,这可能不是我们想要的,如何避免呢?

    1.4K20

    【C++】C++ 引用详解 ① ( 变量的本质 - 引入 “ 引用 “ 概念 | 引用语法简介 | 引用做函数参数 | 复杂类型引用做函数参数 )

    ; 提高代码可读性 : 引用使用时 , 类似于 一级指针 , 使用引用期间 , 不需要 使用 取地址符 & 和 指针符号 * , 提高了代码可读性 和 可维护性 ; 函数返回值 : 函数引用参数 可以作为...; 使用引用作为函数参数时 , 传入的实参不需要使用取地址符获取 , 直接将变量传入函数即可 ; 在函数中 访问引用 时 , 不需要使用指针 , 直接使用引用访问传入的变量 ; 代码示例 : //...变量交换函数 ; 函数参数接收 指针变量 作为 参数 , 传入的实参是变量的地址 ; 在函数内部 , 访问变量需要通过 指针 * 符号进行 ; 这样可以实现 外部变量 的数值交换 , 但是 使用 指针..., 实际上等同于一级指针 ; 使用引用作为函数参数时 , 传入的实参不需要使用取地址符获取 , 直接将变量传入函数即可 , 在函数中获取引用的值时 , 不需要使用指针 , 直接使用引用访问传入的变量...指针 , 函数传递 : 这种方式传递的是 结构体 指针 , 实际上是指针的副本 , 几乎不消耗性能 ; 参数访问 : 传入的 指针 参数 在函数中 使用 -> 访问结构体成员 ; 参数修改 : 通过指针

    1.1K21

    令人疑惑的引用和指针

    b是一个引用,但并非一个对象,同时引用的类型都要和对象的类型严格匹配(在具有继承关系的类中是例外,这里不展开),因此有下面的操作: int a = 1024; int &b = a; int &c =...同样的,它也要求指针的类型和指向的类型严格匹配。...正因如此,使用引用而非指针作为函数的参数是一个不错的选择,因为引用永远不为空,函数入口也就不需要做过多的检查,引用也就更富效率。...= 11;//使用指针需要解引用 作为参数时的差别 指针作为参数时,看起来是地址传参,实际上仍然传值,即将指针的一个拷贝作为实参,而由于指针指向的是一个对象,因此在函数内可以实现对指针所指向对象的内容进行改变...而引用作为参数时,实际上传递的对象本身,但又不需要拷贝,因为引用绑定的就是对象。 总结 从前面的内容来看,除了使用方法的差异意外,引用似乎像是弱化版的指针,是不是有点像指针常量呢?

    61020

    关于变量、指针、别名(引用)和指针的指针

    C/C++中的指针和别名这个东西确实是够恶心的。...,并且用&进行取地址操作的得到的地址和原变量的地址是完全一致的(因而在对指针进行赋值的时候如果直接对指针地址操作则需要对变量或者别名使用&进行取地址运算,如果要直接赋值则需要使用*p=进行赋值)。...最复杂的就是指针了,同样个人认为指针到头来就是一个地址,这样可能会比较好理解一些。例如*pointer,那么带有*(解引用操作符)的时候则是表示的数值,如果没有*则表示的是地址。...指针的指针则就更加复杂了,例如**p,那么可以看作指针保存的数据是另外的一个指针,解引用操作一次将会得到一个*p,这仍然是个指针,当进行二次解引用操作的时候(**p)才能读到p中保存的数据信息。...//指针赋值 ppi=&ppiA; //指针的指针赋值 cout指针和指针的指针的关系:"<

    1.4K30

    Golang函数参数的值传递和引用传递

    1、值传递 2、引用传递 1、值传递 golang有值传递与引用传递两种传递方式 函数如果使用参数,该变量可称为函数的形参。...形参就像定义在函数体内的局部变量 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数 也就是说,函数传递的原来数据的拷贝,一个副本,比如当传递一个...传递一个指针类型的参数,其实传递的就是这个指针类型的拷贝,而不是这个指针执行的值 默认情况下,Go语言使用的是值传递(则先拷贝参数的副本,再将副本传递给函数),即在调用过程中不会影响到实际参数 代码示例...引用传递 引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数 由于引用类型(slice、map、interface、channel)自身就是指针,所以这些类型的值拷贝给函数参数...函数 * &a 指向 a 指针,a 变量的地址 * &b 指向 b 指针,b 变量的地址 */ swap(&a, &b) fmt.Printf("交换后,a 的值 : %d\n", a

    2.5K10

    详解c++指针的指针和指针的引用

    展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它。...(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递。...输出的是两个2 使用指针的指针 展示一下使用指针的指针做为参数 void func(int **p) { *p = &m_value; // 也可以根据你的需求分配内存 *p...换句话说,我们修改的是main()方法里 *pn指针 **p: 两次解引用是指向main()方法里*pn的内容 指针的引用 再看一下指针的引用代码 int m_value = 1; void func...看一下func(int *&p)方法 p:  是指针的引用,main()方法里的 *pn *p:是main()方法里的pn指向的内容。

    1.3K60

    迟来的函数传参补充——传引用【引用调用】【c++】

    1、传引用 函数传参,几乎一直在用简单的值传递,或者传指针,前者生成一个源结构的副本,后者链表或者树的时候用的比较多,本文补充到一个类似值传递的函数调用方式,函数定义的传参位置却是地址接收方式,这就是传引用...其实早就在王道见过,只是没注意其中的奥妙,怪就怪我线性表题目爱用数组解决,栈和队列喜欢用结构体内置函数的方式实现,完全用不到引用。...f(int &,int &); 1.2.2、常量引用 稍微讲究一点的用法,往往是定义一个输出函数的传入参数设为常引用,意味着无更改要求。...&); 1.3、案例 1.3.1、常见变量引用做函数参数 比如实现一个交换两个变量的值,过去确实只会值传递,像是涉及到改变值的操作,都会下意识的去写在main函数中,将结果在传给下一个需要相关值的函数...除非参数结构很小,否则一般会通过引用将结构体传递给函数。

    17230

    c++:指针和引用的区别

    目录 前言: 1、引用概念上是定义一个变量的别名,而指针是存储一个变量的地址。 2、引用在定义时必须要初始化,但是指针没有要求。...3、引用在初始化时引用一个实体后,就不能再引用其他实体,因为其本质是一个指针常量,无法改变指向。而指针可以在任何时候指向任何一个同类型实体。 4、没有NULL引用,但有NULL指针。...6、引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。 7、有多级指针,但是没有多级引用。 8、访问实体方式不同,指针需要显示解引用,引用则由编译器自己处理。...9、引用比指针使用起来相对安全。 ---- 前言: 指针和引用区别经常在面试中出现, 下面总结出以下区别 1、引用概念上是定义一个变量的别名,而指针是存储一个变量的地址。...2、引用在定义时必须要初始化,但是指针没有要求。 3、引用在初始化时引用一个实体后,就不能再引用其他实体,因为其本质是一个指针常量,无法改变指向。而指针可以在任何时候指向任何一个同类型实体。

    53630

    C++ 指针和引用的区别

    本质上指针是一个变量,所以它有自己的类型,这个类型决定了它可以指向何种类型的数据对象;之所以使用数据对象这个说法,是因为指针能够代表的远远不止变量,还包括数组,数组元素,结构体,甚至函数。...换句话说一个引用在声明的时候就必须要初始化(除了作为函数的参数),而指针是没有这个问题的,我们在定义一个指针但是不让它指向任何对象,是完全可以的: //错误,需要初始值 int &b;...这个问题和上面的其实是对应的,既然指针在定义的时候可以为空,但是一个为空的指针对实现一个功能是没有用的,为了代码的鲁棒性,我们必须时刻考虑指针为空的情况,这在指针作为函数的参数时尤为常见。...由于引用的声明和初始化总是在一起的,所以不可能让一个对象的引用指向另一个,这完全没有道理,假设a的引用是c,那么在执行int &c=b;就重定义了,如果执行c = b;,那么只是把b的值赋值给c,也就是...endl; cout<<a<<endl; c = b; p = &b; cout<<c<<endl; cout<<a<<endl; (4)应用区别: 以上的特性决定了指针和引用的一些应用上的区别

    1K80

    指针*和引用&的区别使用

    int a; int &at; at = a; 在指针中是可以的,但是&不允许,&必须在声明时将其初始化。 引用经常被用作函数参数,使得函数中的变量名成为调用程序中变量的别名。...这种调用方法我一直搞得晕晕的,正好这次一次性根除。这种传递参数的方法称为按引用传递。按引用传递允许被调用函数能够访问调用函数中的变量。这是C++相比C的一个超越。...//如果理解不了,这样理解:参数中的*和&只是走个过场,告诉人家那个参数是什么类型的 //调用函数时的参数是a,不是*a,也不是&a //所以&a传的这个a是一个int类型,而*a的这个a就是指针...将引用参数声明为const数据的好处有这些: 防止无意中被修改。 使用const参数可以兼容非const传参。 将引用用于结构 C++引入引用主要就是为了和结构和类。...下面是一个反面教材: Str& test(const Str &d) { Str &e; ··· return e; } 何时使用引用参数? 程序员能够修改调用函数中的数据对象。

    1.1K50

    【C++】函数指针 ④ ( 函数指针做函数参数 | 使用函数指针间接调用函数 | 函数指针做参数 | 函数指针类型的本质 | 函数指针做参数意义 )

    一、函数指针做函数参数 1、使用函数指针间接调用函数 在上一篇博客 【C++】函数指针 ③ ( 函数指针语法 | 函数名直接调用函数 | 定义函数指针变量 | 使用 typedef 定义函数类型 | 使用..., int); 定义函数 接收 pFun_add 类型的形参作为参数 , 该类型是 函数指针类型 , 也就是 函数接收一个 函数指针类型参数 , 在该函数中调用 函数指针 指向的 函数 ; // 传入函数指针...其它函数中执行 ; 4、函数指针做参数意义 函数指针做参数意义 : 提高程序灵活性 : 通过使用函数指针作函数参数 , 这样可以 在 程序 运行时 动态地 设置 要调用的函数 , 提高了程序的灵活性...C 语言 中模拟面向对象用法 ; 可以将特定的 函数指针类型 定义为 结构体 的一部分 , 并使用该 结构体 来传递具有特定行为的对象的地址 ; 该操作有助于更好地组织代码 , 使代码更易于理解和维护...; 错误处理 : 使用函数指针 , 将错误处理函数作为参数传递给其他函数 , 在发生错误时立即调用适当的错误处理函数 , 无需返回到调用堆栈中的较高层次 ; 二、代码示例 - 函数指针做函数参数 代码示例

    1.5K50

    指针和引用的区别是什么

    int x = 5; int y = 6; int &r = x; 指针变量有自己的实际地址和所占空间的大小,x86 上一般是 32 位,但是引用是和它绑定的变量共享一个地址。...int x = 0; int &r = x; int *p = &x; int *p2 = &r; assert(p == p2); 指针可以指向指针的指针,指针的指针的指针,甚至更多层的指针,但引用只能有一层...指针需要以*来取值,引用不用。指向结构体或类对象的指针,还可以以->来获取其内部的成员,引用则使用.。 没有“引用数组”这种说法,只有“指针数组”。...常量引用可以绑定临时对象,也就是右值,指针不行,搞不好会段错误。...引用用于函数的参数和返回值,有的时候会很有用。比如参数const std::string& name,还有单例模式中的引用返回。

    38520

    C++中指针和引用的区别

    注意:引用作为函数参数时,会引发一定的问题,因为让引用作参数,目的就是想改变这个引用所指向地址的内容,而函数调用时传入的是实参,看不出函数的参数是正常变量,还是引用,因此可能引发错误。...在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传递参数是有本质上的不同的: 指针传递参数本质上是 值传递的方式,它所传递的是一个地址值。...引用传递和指针传递是 不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。...而对于指针 传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量,那就得使用指向指针的 指针,或者指针引用。...引用的主要功能是传递函数的参数和返回值。C++语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。     以下是“值传递”的示例程序。

    5.1K82
    领券