笔试面试1Word格式.docx
- 文档编号:16143261
- 上传时间:2022-11-20
- 格式:DOCX
- 页数:7
- 大小:19.08KB
笔试面试1Word格式.docx
《笔试面试1Word格式.docx》由会员分享,可在线阅读,更多相关《笔试面试1Word格式.docx(7页珍藏版)》请在冰豆网上搜索。
三、int(*a)(int);
//Apointertoafunctionathattakesanintegerargumentandreturnsaninteger
四、int(*a[10])(int);
//Anarrayof10pointerstofunctionsthattakeanintegerargumentandreturnaninteger
2.
关键字static的作用是什么?
在C语言中,关键字static有三个明显的作用:
●
在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
3.
下面的声明都是什么意思?
constinta;
intconsta;
constint*a;
int*consta;
intconst*aconst;
前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
4.
下列哪两个是等同的
intb;
Aconstint*a=&
b;
Bconst*inta=&
Cconstint*consta=&
Dintconst*consta=&
答:
C、D相等,数据类型放在const前后是一样的。
5.
那么我为什么还要如此看重关键字const呢?
关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉用户这个参数的应用目的。
如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。
(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。
)
通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。
简而言之,这样可以减少bug的出现。
6.
什么是回调函数?
简而言之,回调函数就是被调用者回头调用调用者的函数。
使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个被调用函数。
而该被调用函数在需要的时候,利用传递的地址调用回调函数。
回调函数,就是由你自己写的,你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。
这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。
回调主要是在异步处理时使用,在主线程注册回调函数,然后在子线程真正执行回调函数,单线程意义不是很大。
7.
如何定义和实现一个类的成员函数为回调函数?
a.
声明;
b.
定义;
c.
设置触发条件,就是在你的函数中把你的回调函数名作为一个参数,以便系统调用
一、声明回调函数类型
typedefvoid(*FunPtr)(void);
二、定义回调函数
classA
{
public:
A();
staticvoidcallBackFun(void)
//回调函数,必须声明为static
{
cout<
<
"
callBackFun"
endl;
}
virtual~A();
};
三、设置触发条件
voidFuntype(FunPtrp)
p();
}
voidmain(void)
Funtype(A:
:
callBackFun);
8.
回调函数与API函数
回调和API非常接近,他们的共性都是跨层调用的函数。
但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;
而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它通过一个函数指针来保存这个回调函数,在需要调用时,只需引用这个函数指针和相关的参数指针。
其实:
回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。
9.
论述含参数的宏与函数的优缺点
宏:
优点:
在预处理阶段完成,不占用编译时间,同时,省去了函数调用的开销,运行效率高
缺点:
不进行类型检查,多次宏替换会导致代码体积变大,而且由于宏本质上是字符串替换,故可能会由于一些参数的副作用导致得出错误的结果。
函数:
没有带参数宏可能导致的副作用,进行类型检查,计算的正确性更有保证。
函数调用需要参数、返回地址等的入栈、出栈开销,效率没有带参数宏高
PS:
宏与内联函数的区别
内联函数和宏都是在程序出现的地方展开,内联函数不是通过函数调用实现的,是在调用该函数的程序处将它展开(在编译期间完成的);
宏同样是;
不同的是:
内联函数可以在编译期间完成诸如类型检测,语句是否正确等编译功能;
宏就不具有这样的功能,而且宏展开的时间和内联函数也是不同的(在运行期间展开)
10.
关键字volatile有什么含意?
一个参数既可以是const还可以是volatile吗?
解释为什么。
一个指针可以是volatile吗?
下面的函数有什么错误?
intsquare(volatileint*ptr)
return*ptr**ptr;
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
下面是volatile变量的几个例子:
Ø
1).并行设备的硬件寄存器(如:
状态寄存器)
2).一个中断服务子程序中会访问到的非自动变量(Non-automaticvariables)
3).多线程应用中被几个任务共享的变量
1).是的。
一个例子是只读的状态寄存器。
它是volatile因为它可能被意想不到地改变。
它是const因为程序不应该试图去修改它。
2).是的。
尽管这并不很常见。
一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
3).这段代码的有个恶作剧。
这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:
inta,b;
a=*ptr;
b=*ptr;
returna*b;
由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。
结果,这段代码可能返不是你所期望的平方值!
正确的代码如下:
longsquare(volatileint*ptr)
inta;
returna*a;
11.
Typedef在C语言中频繁用以声明一个已经存在的数据类型的同义字。
也可以用预处理器做类似的事。
例如,思考一下下面的例子:
#definedPSstructs*
typedefstructs*tPS;
以上两种情况的意图都是要定义dPS和tPS作为一个指向结构s指针。
哪种方法更好呢?
为什么?
typedef更好。
举例:
dPSp1,p2;
tPSp3,p4;
第一个扩展为
structs*p1,p2;
上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。
第二个例子正确地定义了p3和p4两个指针。
12.非C++内建型别A和B,在哪几种情况下B能隐式转化为A?
[C++中等]
classB:
publicA{……}//B公有继承自A,可以是间接继承的
classB{operatorA();
}//B实现了隐式转化为A的转化
classA{A(constB&
);
}//A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数
A&
operator=(constA&
//赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个
13.
十三、以下代码中的两个sizeof用法有问题吗?
voidUpperCase(charstr[])//将str中的小写字母转换成大写字母
for(size_ti=0;
i<
sizeof(str)/sizeof(str[0]);
++i)
if('
a'
=str[i]&
&
str[i]<
='
z'
)
str[i]-=('
-'
A'
有问题,sizeof取到的是指针大小(因为是址传递),第一个sizeof(str)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 笔试 面试