zoukankan      html  css  js  c++  java
  • 指针与引用

    一、指针

            指针指向一块内存,它的内容是所指内存的地址。所以说。指针就是地址


    1、指针的声明及初始化

           看下样例

    int ival = 1024;int *pi = 0;    正确。0表示空地址
    int *pi0 = 5;  错误。5是详细数字,不能表示地址
    int *pil;   正确,声明,并没有初始化
    *pil = 5;  正确,pil地址里的数字是5,*pil指向5,同理*pil = ival是正确的
    pil= &ival;   正确。pil就是地址,所以把5的地址赋值给pil是正确的
    int *pil = &val;   正确pi = pil;  正确,就是地址之间的赋值
    pil = 0;   正确,空地址

    *p++     表示先完毕取值操作。再对地址运行++操作。是地址的++。*运算符优先级高于++。

    (*p)++   表示*p所指向值的自加运算。是值的++


    2、void *指针

           不论什么类型的指针都能够直接赋值给它,无需进行强制类型转换。

            比如:

    void *p1;
    int *p2;
    p1 = p2; 

    3、指向指针的指针

            简单的说就是,A指针的地址存在B指针中,则B指针就是指向指针的指针。


    4、指针函数与函数指针

    4.1、指针函数是指带指针的函数,即本质是一个函数。

    函数返回类型是某一类型的指针

    类型标识符    *函数名(參数表)

          int *f(xy);

            首先它是一个函数,仅仅只是这个函数的返回值是一个地址值。

    函数返回值必须用同类型的指针变量来接受。

    float *fun();
    float *p;
    p = fun(a);


    4.2、函数指针是指向函数的指针变量,即本质是一个指针变量

     int (*f) (int x); /* 声明一个函数指针 */

        指向函数的指针包括了函数的地址,能够通过它来调用函数。声明格式例如以下:

    类型说明符 (*函数名)(參数)


        假设没有圆括号,就变成了一个返回整型指针的函数的原型声明。
           比如:
                  void (*fptr)();
        把函数的地址赋值给函数指针,能够採用以下两种形式:
                  fptr=&Function;
                  fptr=Function;
        取地址运算符&没必要的,由于单单一个函数标识符就标号表示了它的地址,假设是函数调用,还必须包括一个圆括号括起来

    的參数表。

         总结,基本的差别是函数指针是指针变量(必需要用括号括起来),指针函数是函数。


    二、引用

         引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作全然一样。

         sizeof(引用)得到的是变量的大小。

    1、声明及初始化

      引用的声明方法:类型标识符 &引用名=目标变量名。

      【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用。即别名
      说明:
     (1)&在此不是求地址运算,而是起标识作用。

     (2)类型标识符是指目标变量的类型

     (3)声明引用时,必须同一时候对其进行初始化。 

     (4)引用声明完成后,相当于目标变量名有两个名称。即该目标原名称和引用名,且不能再把该引用名作为其它变量名的别名。


          ra=1; 等价于 a=1;

     (5)声明一个引用,不是新定义了一个变量,它仅仅表示该引用名是目标变量名的一个别名。它本身不是一种数据类型,因此引用

             本身不占存储单元。系统也不给引用分配存储单元。

    故:对引用求地址,就是对目标变量求地址。&ra与&a相等。

     (6)不能建立数组的引用。由于数组是一个由若干个元素所组成的集合。所以无法建立一个数组的别名。



    2、引用应用

    2.1、引用作为參数
         引用的一个重要作用就是作为函数的參数。曾经的C语言中函数參数传递是值传递,假设有大块数据作为參数传递的时候,採用

    的方案往往是指针,由于 这样能够避免将整块数据所有压栈,能够提高程序的效率。

    可是如今(C++中)又添加了一种相同有效率

    的选择(在某些特殊情况下又是必须的选择),就是引 用。

    { int p; p=p1; p1=p2; p2=p; }
    
    main( )
    {
     int a,b;
     cin>>a>>b; //输入a,b两变量的值
     swap(a,b); //直接以变量a和b作为实參调用swap函数
     cout<<a<< ' ' <<b; //输出结果
    }
    

    上述程序执行时。假设输入数据10 20并回车后,则输出结果为20 10。

    说明:

    (1)传递引用给函数与传递指针的效果是一样的。

    (2)使用引用传递函数的參数。在内存中并没有产生实參的副本。它是直接对实參操作。


    2.2、常引用
      常引用声明方式:const 类型标识符 &引用名=目标变量名;
      用这样的方式声明的引用。不能通过引用对目标变量的值进行改动,从而使引用的目标成为const,达到了引用的安全性。


    int a ;
    const int &ra=a;
    ra=1; //错误
    a=1; //正确

    2.3、引用作为返回值
      要以引用返回函数值,则函数定义时要按下面格式:
    类型标识符 &函数名(形參列表及类型说明)
                        {函数体}
      说明:
      (1)以引用返回函数值,定义函数时须要在函数名前加&。
      (2)用引用返回一个函数值的最大优点是。在内存中不产生被返回值的副本。


    3、值传递、指针传递、引用传递

    值传递不能够交换參数

    指针传递、引用传递能够交换參数。但指针传递是副本传递。浪费内存;引用传递节省内存。

  • 相关阅读:
    swift 第十四课 可视化view: @IBDesignable 、@IBInspectable
    swift 第十三课 GCD 的介绍和使用
    swift 第十二课 as 的使用方法
    swift 第十一课 结构体定义model类
    swift 第十课 cocopod 网络请求 Alamofire
    swift 第九课 用tableview 做一个下拉菜单Menu
    swift 第八课 CollectView的 添加 footerView 、headerView
    swift 第七课 xib 约束的优先级
    swift 第六课 scrollview xib 的使用
    swift 第五课 定义model类 和 导航栏隐藏返回标题
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7216337.html
Copyright © 2011-2022 走看看