zoukankan      html  css  js  c++  java
  • Xcode学习C++(二、指针和引用)

    一:指针部分

    指针是一种变量类型,声明指针变量需要分配独立的存储空间,指针可以为空『void』表示不指向任何对象。

    指针里存储的值是一个地址,可以通过这个地址获取和改变所存储变量的值。

    指针的类型必须与其所指向变量的类型一致,可以在任何时候改变指向的变量……

    ————————————————————这些是简单理论的啰嗦,下面说些代码相关的————————————————————————————

    定义方式:int *p = &a;  *是指针的标识符,表示p是一个指针类型的变量,这里的变量a,必须是一个int类型。 &运算符可以获取变量的地址

    取值方式:(可能有点绕)通过指针获取所指向变量的值是这样做的:*p

    int a = 10;
        int *pa = &a;
        cout<<a<<"----"<<*pa<<"----"<<&a<<"----"<<pa<<endl;
    View Code

    输出结果:10----10----0x7fff5fbff89c----0x7fff5fbff89c

    可以看到通过*pa获取的值跟a的值一样,a的地址和pa的值也一直,说明指针类型的变量pa的值就是a的地址。

    关于指针呢,还有很多东西可以讲,比如指针运算、指向指针的指针、指针方法的指针、指针作为函数参数等等,下次针对指针专门来写写看

    二:引用部分

    有JAVA或C#等语言基础的人对于引用的认识估计和指针没什么区别,在C++里这两者区别甚大,这也是我学习C++到目前为止跟之前知识体系差距最大的一点。

    C++中引用其实就是给变量起一个别名,引用没有自己独立的存储空间,与它引用的变量共享能存,对引用的操作就是对变量的操作(真假美猴王)。

    定义方式 int &f = a; &这里又是引用的标识符,f是一个对变量a的引用。f的类型是int那么a的类型也必须是int。

    int a = 10;
    int &fa = a;
    cout<<a<<"----"<<fa<<"----"<<&a<<"----"<<&fa<<endl;
    View Code

    输出结果:10----10----0x7fff5fbff89c----0x7fff5fbff89c

    可以看到引用fa的值和地址与变量a的值和地址一致。

    三:引用的使用注意

    引用必须在定义的时候就进行初始化。下面的是错误写法:

    int &af;

    引用一旦在定义的时候确定好引用哪个变量,以后都不能再引用其他变量

    int a = 10;

    int &af = a;

    int b = 20;

    af = b;

     最后一行代码af = b;并不代表af引用了变量b,而是将变量b的值赋值给了af引用,也就是将变量b的值给了a

    四:const 与 引用

    下面的代码效果:不能通过af引用修改变量a的值。称af为const引用

    int a = 10;

    const int &af = a;

    下面的代码是不能编译通过的。因为ref引用的类型和变量d的类型不匹配

    double d = 1.78;

    int &ref = d;

    但是将ref改为const引用,就能编译通过

    double d = 1.78;

    const int &ref = d;

    编译能通过的原因是const int &ref = d;等价于下面2句:

    int temp = d;

    const int &ref = temp;

    也就是说ref引用 跟 变量d 并不共享同一块存储空间

    五:引用 与 函数参数

    引用可以作为函数的形参,修改了引用形参,能影响外面实参变量的值

    如果要在函数内部修改外面实参的值,尽量使用引用作为形参,不要使用指针作为函数形参,原因如下:

    引用不占用额外的存储空间

    使用引用修改实参显得更自然、易懂

    六:引用 与 函数返回值

    引用也可以作为函数的返回值,主要目的是:可以将函数调用放在赋值运算符(=)的左边

    int ages[] = {20, 15, 36, 17, 28};

    int & ages_index(int i)

    {

        return ages[i];

    }

    // 相当于ages[0] = 30;

    ages_index(0) = 30;

    注意:不能返回对局部变量的引用

    int & add(int a, int b)

    {

        int sum = a + b;

        return sum;

    }

     int n = add(10, 20);

    int &nf = add(10, 10);

    cout << "n = " << n << endl;

    cout << "nf = " << nf << endl;

    上面的程序会造成nf引用的值是不确定的,并不是20

  • 相关阅读:
    跳跃游戏
    不同路径
    最大子序和
    最长回文子序列
    最长公共子序列
    零钱兑换
    合并区间
    寻找数组的中心索引
    制造小程序中的一些经验
    h5写的一个签到积分系统
  • 原文地址:https://www.cnblogs.com/luseike/p/4381491.html
Copyright © 2011-2022 走看看