指针与引用 

  1. 指针

    (1) 指针是一个变量(实体),存储的是一个地址,指向内存的一个存储单元,指针可以为空

    (2) 指针可以为空,在声明定义时可以不初始化

    (3) 指针在初始化之后可以重新指向其他的存储单元

    (4) 指针可以有多级  

    (5) 指针使用时需要解引用

    (6) sizeof指针得到的是指针本身大小(所指向的变量或对象的地址)

    (7) 指针的自增是地址的改变而不是指针所指向变量的改变

    (8) 程序为指针变量分配内存区域

  2. 引用

    (1) 引用是原变量的一个别名,跟原来的变量实质是同一个对象

    (2) 引用不能为空,在声明定义时必须初始化(本就是一个别名,怎么能没有本体呢)

    (3) 引用一但被绑定就不能再更改

    (4) 引用只能是一级,没有引用的引用(本就是一个别名,别名怎么还能有别名呢)

    (5) 使用引用时无需解引用

    (6) sizeof引用得到的是所指向变量(对象)的大小

    (7) 对引用的操作即是对原变量的操作

    (8) 程序为引用不需分配内存区域

    (9) void 类型不能有引用,void只是在语法上相当于一个类型,因为它本身不是类型,所以不能有引用

    (10) 数组不能引用,但是数组指针可以引用

  如何确定是使用指针还是引用:采用指针还是引用取决于你是否需要考虑"不指向任何对象"或"在不同时间指向不同对象"的能力,如果要,那么选择指针,否则引用会更有效

    一个变量可以有多个引用,同样也可以有多个指针指向同一个变量

  传指针与传引用的实例:

      int a,b;

      引用:swap(a,b); void swap (int &p1, int &p2) {}

      指针:swap(&a, &b); void swap (int *p1, int *p2) {}

    实例总结:使用引用传递函数的参数,内存中并没有产生实参的副本,它是直接对实参操作;使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参的副本;

      如果传递的是对象,那么还将调用拷贝构造函数,因此当参数传递的数据较大时,传引用比用一般变量传递参数的效率和所占空间都好;使用指针作为函数的参数虽然也能达到与使用引用相同的

      效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差,另一方面,在主调函数的调用点,必须用变量的

      地址作为实参,而引用更容易使用,更清晰。

  const 引用: 声明方式: int a; const int &ra = a;// ra = 1;错误          a = 1;正确  这不光是让代码更健壮,也有其他方面的需要  

  引用作为返回值:函数定义格式:类型标识符 &函数名(形参列表及类型说明) {函数体}     假如是定义在类外,那么&放在类名之前,返回值类型之后

      1. 以引用返回函数值,定义函数时需要在函数名前加&    2. 用引用返回一个函数值的最大好处是在内存中不产生被返回值的副本 

      3. 不能返回函数内部被new分配的内存,这种情况虽然不存在局部变量的自动销毁问题,但是被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的

        空间就无法释放,造成内存泄露,在函数内部new的一块内存,如果我们没有主动delete,那么就会产生内存泄露,直至程序结束被系统收回

      4. 函数的返回类型决定函数调用是否是左值,调用一个返回引用的函数得到左值,其他返回类型得到右值,可以像使用其他左值一样使用函数调用返回的非常量引用如get_val() = ’s';常量引用不能赋值

  引用总结:在引用的使用中,单独给某个变量取个别名是毫无意义的,引用的目的主要是用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题.用引用传递函数的参数,能保证参数

        传递中不产生副本,能提高传递的效率,且通过const的使用,保证了引用传递的安全性

C++学习笔记 指针与引用的更多相关文章

  1. Dubbo -- 系统学习 笔记 -- 示例 -- 泛化引用

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 泛化引用 泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值 ...

  2. C++面试笔记--指针和引用

    面试一:指针与引用的区别? 答案: (1)非空区别.在任何情况下都不能使用指向空值的引用.因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针 ...

  3. C/C++学习笔记----指针的理解

    指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一.利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯:指针能 ...

  4. C++学习笔记29,引用变量(1)

    引用变量在创建的时候就必须初始化.无法创建一个未被初始化的引用. #include <iostream> using namespace std; int main() { int x=1 ...

  5. c语言学习笔记 - 指针和字符串

    前面学习了字符串是一种字符数组,又知道了指针变量和数组的关系,这里来看一下指针和字符串的关系. #include <stdio.h> int main(void){ char str = ...

  6. c语言学习笔记 - 指针和数组

    结合内存存储数据的机制,c语言里指针的出现和使用也就不奇怪了,如果先学了内存的一些知识,以及程序运行机制,到了c指针这块就会清晰很多. #include <stdio.h> int mai ...

  7. 吴裕雄--天生自然C++语言学习笔记:C++ 引用

    引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量 C++ 引用 vs 指针 引用很容易与指针混淆,它们之间有三个主要的 ...

  8. Struts2学习笔记-jsp中引用struts2框架

    如果在jsp中需要引用struts2 框架,需在前面加上以下内容 <%@taglib prefix="s" uri="/struts-tags" %> ...

  9. swift学习笔记之-自动引用计数

    //自动引用计数 import UIKit /*自动引用计数(Automatic Reference Counting) 防止循环强引用 Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用 ...

随机推荐

  1. Power BI for Office 365(二)Power Query

    在上一篇中我们看到了Power BI在移动端的支持,从这一篇起降依次介绍Power BI中的各个功能组件,此篇讲通过一个故事来介绍如何在Power Query中获取并且组织数据. 在这个系列中,我们将 ...

  2. Redis相关

    Redis 持久化 1 why 数据需要持久化,当内存数据库使用的情况 防止缓存失效时候的雪崩效应 2 how 两种方式,快照和日志(aof)方式,各有优缺点. Redis的缓存失效策略 1 what ...

  3. UWP webview 键盘bug,回退页面,键盘会弹一下。

    最新项目发现一个关于Webview的键盘bug. 具体问题:当点击Webview 网页里面input之类的东东,输入键盘会弹出来,这个时候,按回退键,键盘会收起来,再按回退键,界面会退到前一个页面,但 ...

  4. vaadin_demo

    简介:主要一个登陆界面,登陆后跳转到主界面: 主界面功能是点新增,新增人员数据会保存到显示列表中: 一个很简单的demo 下面是截图

  5. linux 自编软件运行时权限不足问题

    在非根目录下" ./*.out " 文件时出现显示运行的权限不足的问题,经过调查,有人给出方案: 方案1: 在Linux下执行一个文件时候提示“权限不够”的解决办法如下 转到那个文 ...

  6. 水一道NOIP2002提高组的题【A003】

    [A003]均分纸牌[难度A]———————————————————————————————————————————————————— [题目要求] 有 N 堆纸牌,编号分别为 1,2,…, N.每堆 ...

  7. 缓存依赖中cachedependency对象

    缓存依赖主要提供以下功能:1.SQL 缓存依赖项可用于应用程序缓存和页输出缓存.2.可在 SQL Server 7.0 及更高版本中使用 SQL 缓存依赖项.3.可以在网络园(一台服务器上存在多个处理 ...

  8. [数据库]redis与redis操作

    网上搜了以下redis的入门操作,全TM的关于怎么安装配置和性能特点的. 基本的CRUD(Create, Read, Update, Delete)就谁也没说,简直气疯了. 先记录下自己常用的命令,后 ...

  9. Apache虚拟主机配置,实现多域名访问本地项目PHP空间,以及配置403Forbidden等错误的解决办法

    第一步: apache主配置文件修改: 用文本编辑器打开apache的conf目录下 httpd.conf 将下面以下代码取消注释 LoadModule rewrite_module  modules ...

  10. android中的回调简单认识

    首先说一下最抽象的形式--2个类,A类和B类.A类含有1个接口.1个接口变量.(可能含有)1个为接口变量赋值的方法以及1个会使用接口变量的"地方";B类实现A中的接口,(可能)含有 ...