• C/C++笔试经典程序(二)


    1.下面5个函数哪个能够成功进行两个数的交换?

    image

    swap1传的是值的副本,在函数体内被修改了形参p、q(实际参数a、b的一个拷贝),p、q的值确实交换了,但是它们是局部变量,不会影响到主函数中的a和b。当函数swap1生命周期结束时,p、q所在栈也就被删除了。

    swap2和swap3传的是一个地址进去,在函数体内的形参*p、*q是指向实际参数a、b地址的两个指针。

    swap5函数与swap4类似,是一个引用传递,修改的结果直接影响实参。

    2.写出函数指针、函数返回指针、const指针、指向const的指针、指向const的const
    指针。

    image

    3.找出下面程序的错误,并解释它为什么是错的。

    image

    程序体存在着函数指针的错误使用问题。正确程序如下:

    image

    4.描述下列指针

    (1)float(**def)[10];
    def是一个二级指针,它指向的是一个一维数组的指针,数组的元素都是float。
    (2)double*(*gh)[10];
    gh是一个指针,它指向一个一维数组,数组元素都是double*。
    (3)double(*f[10])();
    f是一个数组,f有10个元素,元素都是函数的指针,指向的函数类型是没有参数且返回
    double的函数。
    (4)int*((*b)[10]);
    就跟“int* (*b)[10]”是一样的,是一维数组的指针。
    (5)Long (* fun)(int)
    函数指针。
    (6)Int (*(*F)(int,int))(int)
    F是一个函数的指针,指向的函数的类型是有两个int参数并且返回一个函数指针的函
    数,返回的函数指针指向有一个int参数且返回int的函数。

    5.以下程序的输出是

    image

    本题定义一个指针指向一个10个int元素的数组。a+1表明a指针向后移动1*sizeof(数组大小);a+1后共向后移动40个字节。*a+1仅针对这一行向后移动4个字节,如下图所示。*(*(a+1)+2)表示a[1][2]。

    image

    输出如下:1 11 2 2 11。

    6.写出如下程序片段的输出。

    image

    第一个结果好理解,是正常的指针运算。2

    第二个的确是5。首先a表示一个1行5列数组,在内存中表示为一个5个元素的序列。int
    *ptr=(int*)(&a+1)的意思是,指向a数组的第6个元素(尽管这个元素不存在)。那么显然,
    (ptr-1)所指向的数据就是a数组的第5个元素——5。

    image

    image

    时刻牢记这样的观点:数组名本身就是指针,再加个&,就变成了双指针,这里的双指
    针就是指二维数组,加1,就是数组整体加一行,ptr指向a的第6个元素。

    7.C++中有了malloc/free,为什么还需要new/delete?

    malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可
    用于申请动态内存和释放内存。
    对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求。对象在创
    建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库
    函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强
    加于malloc/free。
    因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完
    成清理与释放内存工作的运算符delete。new/delete不是库函数,而是运算符。

    8.this指针
    (1)This指针本质是一个函数参数,只是编译器隐藏起形式的,语法层面上的参数。
    this只能在成员函数中使用,全局函数、静态函数都不能使用this。

    (2)this在成员函数的开始前构造,在成员的结束后清除。这个生命周期同任何一个函
    数的参数是一样的,没有任何区别。当调用一个类的成员函数时,编译器将类的指针作为函
    数的this参数传递进去。

    (3)this指针并不占用对象的空间。this相当于非静态成员函数的一个隐函的参数,不占对象的空间。它跟对象之间没有包
    含关系,只是当前调用函数的对象被它指向而已。this指针会因编译器不同而有不同的放置位置。可能是堆、栈,也可能是寄存器。

    9.以下代码的输出结果是什么

    image

    输出结果为:10,10,9,0。y=i++在循环体内,第二次循环时才执行。

    10. 编程实现单链表删除节点。

    image

    11. 单链表插入节点。

    image

  • 相关阅读:
    【c# 学习笔记】使用virtual和override关键字实现方法重写
    【c# 学习笔记】多态
    【c# 学习笔记】子类的初始化顺序
    mybatis入门截图二
    解析xml文件,遍历输出xml文件中的所有节点, 最终模仿实现struts2框架自动封装参数的功能
    mybatis入门截图总结
    springMVC入门截图
    OA项目总结3
    修改struts2自定义标签的源代码,在原有基础上增加功能(用于OA项目权限判断,是否显示某个权限)
    ongl表达式中得到对象,调用对象方法(OA项目权限显示模块)
  • 原文地址:https://www.cnblogs.com/K2154952/p/4777979.html
Copyright © 2020-2023  润新知