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、值传递、指针传递、引用传递

    值传递不能够交换參数

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

  • 相关阅读:
    教你彻底弄懂JS中this的指向
    js-原型,原型链
    Firefox SyntaxError: invalid regexp group ChunkLoadError: Loading chunk task-show-task-show-module failed.
    什么是标签语义化?标签语义化有什么意义?
    什么是事件委托?jquery和js怎么去实现?
    express框架
    es6
    node搭建服务器
    node内容
    ajax面试题
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7216337.html
Copyright © 2011-2022 走看看