• 郭炜老师(北京大学)程序设计与算法(三)第1周检测题



    xiti001-1.1简单的swap
    ```
    /*
    填空,使得程序输出结果是:5,3
    */
    #include <iostream>
    #include<cstdio>
    using namespace std;
    class A
    {
    public:
    int x;
    int getX() { return x; }
    };
    /*
    传引用 ,那么调用形参a,也就是调用实参a
    */
    void swap(A & a,A & b)
    {
    int tmp = a.x;
    a.x = b.x;
    b.x = tmp;
    }
    int main()
    {
    A a,b;
    a.x = 3;
    b.x = 5;
    swap(a,b);
    cout << a.getX() << "," << b.getX();
    return 0;
    }
    ```
    xiti002-1.2难一点的swap
    ```
    /*
    填空,使得程序输出结果是:
    5,3
    */
    using namespace std;

    #include <iostream>
    #include<cstdio>
    /*
    解答:
    int*&a拆分看:int*(&a),
    int*说明&a整体代表一个指针,
    然后因为&,说明a是一个引用。所以说a是一个指针的引用,
    在swap函数中,交换了两个地址(因为是引用型,所以交换会影响到形参),所以交换成功

    总结我的理解:
    int a;
    int & pa1 = a
    //& 说明pa1是个引用,是int型的引用--引用的是int型的变量,那么操作pa1也就是操作那个整形变量a
    int * pa = &;
    int * & pa2 = pa
    //& 说明pa2是个引用,引用的是(int *)型的变量pa,那么操作pa2也就是操作了那个整形指针变量pa
    //那么,在这个函数中改变pa2里存的值,也就是改变了pa里存的值(也就是把整形指针变量pa指向的内容给改变了,以此达到交换目的)
    */
    void swap(int *&pa2, int *&pb2)
    {
    int * tmp = pa2;
    pa2 = pb2;
    pb2 = tmp;
    }
    int main()
    {
    int a = 3,b = 5;
    int * pa = & a;
    int * pb = & b;
    swap(pa,pb);
    cout << *pa << "," << * pb;
    return 0;
    }
    ```
    xiti003-1.3好怪异的返回值
    ```
    /*填空,使得程序输出指定结果
    输入:无
    输出:10
    */
    #include <iostream>
    #include<cstdio>
    using namespace std;
    /*
    1-函数返回值是个int型的引用,
    2-return 返回了int型的a[i]
    也就是函数返回值引用了整形变量a[i],
    对返回值赋值,也就是对引用的整形变量a[i]赋值,从而达到操作a[i]的效果
    */
    int & getElement(int * a, int i)
    {
    return a[i];
    }
    int main()
    {
    int a[] = {1,2,3};
    getElement(a,1) = 10;
    cout << a[1] ;
    return 0;
    }
    ```
    xiti004-1.4神秘的数组初始化(解答详见下面的问题回答部分)
    ```
    /*填空,使得程序输出指定结果
    输入:无
    输出:123,456
    */
    #include <iostream>
    #include<cstdio>
    using namespace std;
    int main()
    {
    //用指针数组定义二维数组
    int * a[] = {0,0,new int[6],new int[6]};
    *a[2] = 123;
    a[3][5] = 456;
    if(! a[0] )
    {
    cout << * a[2] << "," << a[3][5];
    }
    return 0;
    }
    ```
    问题:用指针数组int*a[3] ;for(int i=0;i<3;i++){ a[i]=new int[6] }也可以创建二维数组啊 对么?
    回答:
    没错!功能跟二维数组一样!
    指针数组首先是一个数组,这个数组中的每个元素都是指针变量,每个指针变量也可以指向一个数组,但数组的元素必须和前面申请的类型一致,此时a就可以看做是二维数组
    指针如果再指向的是数组,这个数组的内存怎么申请或者释放完全由开发人员决定,你可以自己申请也可以系统帮你申请,看你要怎么用。
    这是动态分配数据,注意自己申请一定要记得释放。new的放在堆上,用完后要delete
    虽然他的功能跟二维数组一模一样,但是还是有些许差别的。在堆上分配,你每new一次,都会在堆上分配一次空间,这块内存是连续的。但是,你new了三次,这是三块内存,实际上,不一定会连续在一起。
    数组int a[3][6]里面的18个元素是连续的地址,但是你申请的指针数组,所对应的每个一维数组int[6]的地址不一定是连续的。按你的方法定义,每个一维数组里的地址是连续的,这几个一维数组之间的地址不是连续的,因为是动态分配的。

    作者 :liangwenhao1108
    CSDN地址 :https://blog.csdn.net/liangwenhao1108/article/details/89147261
    微博地址 :https://weibo.com/p/1005056474319128/wenzhang  
    博客园地址:https://www.cnblogs.com/WHaoL/
    公众号地址:
    版权声明 :我们的精力和生命都是有限的,复制代码的话,到我的CSDN文章里吧。欢迎大家批评指正,让我们一起进步吧!本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    素数推断算法(高效率)
    Hibernate的fetch
    TRIZ系列-创新原理-22-变害为利原理
    Offer是否具有法律效力?
    浅谈C++多态性
    C语言scanf函数详解
    大话设计模式之原型模式
    Android源码文件夹结构
    简单的REST的框架实现
    android startActivityForResult的用法
  • 原文地址:https://www.cnblogs.com/WHaoL/p/10677256.html
Copyright © 2020-2023  润新知