1.下面5个函数哪个能够成功进行两个数的交换?
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
指针。
3.找出下面程序的错误,并解释它为什么是错的。
程序体存在着函数指针的错误使用问题。正确程序如下:
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.以下程序的输出是
本题定义一个指针指向一个10个int元素的数组。a+1表明a指针向后移动1*sizeof(数组大小);a+1后共向后移动40个字节。*a+1仅针对这一行向后移动4个字节,如下图所示。*(*(a+1)+2)表示a[1][2]。
输出如下:1 11 2 2 11。
6.写出如下程序片段的输出。
第一个结果好理解,是正常的指针运算。2
第二个的确是5。首先a表示一个1行5列数组,在内存中表示为一个5个元素的序列。int
*ptr=(int*)(&a+1)的意思是,指向a数组的第6个元素(尽管这个元素不存在)。那么显然,
(ptr-1)所指向的数据就是a数组的第5个元素——5。
时刻牢记这样的观点:数组名本身就是指针,再加个&,就变成了双指针,这里的双指
针就是指二维数组,加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.以下代码的输出结果是什么
输出结果为:10,10,9,0。y=i++在循环体内,第二次循环时才执行。
10. 编程实现单链表删除节点。
11. 单链表插入节点。