c++面试题

1. 引用与指针有什么区别?  

   

2. 堆栈溢出一般是由什么原因导致的?  

       

  

3.  什么函数不能声明为虚函数?  

      

  

4. 写出float x 与“零值”比较的if语句。  

10     

11   

12 5. 不能做switch()的参数类型是:  

13    

14   

15 6. 头文件中的 ifndef/define/endif干什么用?  

16    

17    

18 7. #include 和 #include "filename.h" 有什么区别?  

19    

20    

21 8. C++ 程序中调用被 编译器编译后的函数,为什么要加 extern “C”声明?  

22    

23   

24 9.char str1[] = "abc";  

25 char str2[] = "abc";  

26 const char str3[] = "abc";  

27 const char str4[] = "abc";  

28 const char *str5 = "abc";  

29 const char *str6 = "abc";  

30 char *str7 = "abc";  

31 char *str8 = "abc";  

32 cout << ( str1 == str2 ) << endl;  

33 cout << ( str3 == str4 ) << endl;  

34 cout << ( str5 == str6 ) << endl;  

35 cout << ( str7 == str8 ) << endl;  

36 结果是:  

37    

38 10.  

39 main()  

40 {  

41    int a[5]={1,2,3,4,5};  

42    int *ptr=(int *)(&a+1);  

43    printf("%d,%d",*(a+1),*(ptr-1));  

44 }  

45 输出结果是:  

46    

47   

48 11. 交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;  

49    

50    

51 12. 列举几种进程的同步机制,并比较其优缺点。  

52    

53    

54 13.  进程死锁的原因和4个必要条件  

55    

56    

57 14. 要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?  

58    

59   

60 15.  

61 unsigned char *p1;  

62 unsigned long *p2;  

63 p1=(unsigned char *)0x801000;  

64 p2=(unsigned long *)0x810000;  

65 请问  

66 p1+5=______;  

67 p2+5=______;  

68   

69 16、设有以下说明和定义:  

70 typedef union {long i; int k[5]; char c;} DATE;  

71 struct data { int cat; DATE cow; double dog;} too;  

72 DATE max;  

73 则语句 printf("%d",sizeof(too)+sizeof(max));的执行结果是:______  

74    

75    

76    

77 试题1:  

78    

79 Void test1()  

80 {  

81     char string[10];  

82     char* str1="0123456789";  

83     strcpy(string, str1);  

84 }  

85    

86 试题2:  

87    

88 Void test2()  

89 {  

90     char string[10], str1[10];  

91     for(I=0; I<10;I++)  

92     {  

93         str1[i] ='a';  

94     }  

95     strcpy(string, str1);  

96 }  

97    

98 试题3:  

99    

100 Void test3(char* str1)  

101 {  

102     char string[10];  

103     if(strlen(str1) <= 10)  

104     {  

105         strcpy(string, str1);  

106     }  

107 }  

108 swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC++DEBUG运行时提示错误“Access Violation”。该程序应该改为:  

109    

110    

111    

112   

113 试题4:  

114    

115 void GetMemory( char *p )  

116 {  

117     p = (char *) malloc( 100 );  

118 }  

119 void Test( void )  

120 {  

121     char *str = NULL;  

122     GetMemory( str );  

123     strcpy( str, "hello world" );  

124     printf( str );  

125 }  

126    

127 试题5:  

128    

129 char *GetMemory( void )  

130 {  

131     char p[] = "hello world";  

132     return p;  

133 }  

134 void Test( void )  

135 {  

136     char *str = NULL;  

137     str = GetMemory();  

138     printf( str );  

139 }  

140    

141 试题6:  

142    

143 void GetMemory( char **p, int num )  

144 {  

145     *p = (char *) malloc( num );  

146 }  

147 void Test( void )  

148 {  

149     char *str = NULL;  

150     GetMemory( &str, 100 );  

151     strcpy( str, "hello" );  

152     printf( str );  

153 }  

154    

155    

156   

157 试题7:  

158    

159 void Test( void )  

160 {  

161     char *str = (char *) malloc( 100 );  

162     strcpy( str, "hello" );  

163     free( str );  

164       //省略的其它语句  

165 }  

166 评价以上程序  

167    

168    

169    

170 试题1:分别给出BOOLintfloat,指针变量 与“零值”比较的 if 语句(假设变量名为var)  

171    

172    

173    

174   

175 试题2:以下为Windows NT下的32C++程序,请计算sizeof的值  

176 void Func ( char str[100] )  

177 {  

178  sizeof( str ) = ?  

179 }  

180 void *p = malloc( 100 );  

181 sizeof ( p ) = ?  

182  解答:  

183    

184    

185   

186 试题3:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?  

187 least = MIN(*p++, b);  

188 解答:  

189    

190    

191    

192    

193 试题4:为什么标准头文件都有类似以下的结构?  

194    

195 #ifndef __INCvxWorksh  

196 #define __INCvxWorksh  

197 #ifdef __cplusplus  

198 extern "C" {  

199 #endif  

200   

201 #ifdef __cplusplus  

202 }  

203 #endif  

204 #endif  

205 解答:  

206    

207    

208    

209 试题5:编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”  

210 函数头是这样的:  

211 //pStr是指向以'\0'结尾的字符串的指针  

212 //steps是要求移动的n  

213 void LoopMove ( char * pStr, int steps )  

214 {  

215  //请填充...  

216 }  

217 解答:  

218    

219    

220   

221 试题6:已知WAV文件格式如下表,打开一个WAV文件,以适当的数据结构组织WAV文件头并解析WAV格式的各项信息。  

222 WAVE文件格式说明表  

223 偏移地址 字节数 数据类型 内 容  

224 文件头  

225 00H 4 Char "RIFF"标志  

226 04H 4 int32 文件长度  

227 08H 4 Char "WAVE"标志  

228 0CH 4 Char "fmt"标志  

229 10H 4   过渡字节(不定)  

230 14H 2 int16 格式类别  

231 16H 2 int16 通道数  

232 18H 2 int16 采样率(每秒样本数),表示每个通道的播放速度  

233 1CH 4 int32 波形音频数据传送速率  

234 20H 2 int16 数据块的调整数(按字节算的)  

235 22H 2   每样本的数据位数  

236 24H 4 Char 数据标记符"data"  

237 28H 4 int32 语音数据的长度  

238 解答:  

239    

240    

241    

242 试题7:编写类String的构造函数、析构函数和赋值函数,已知类String的原型为:  

243 class String  

244 {  

245  public:  

246   String(const char *str = NULL); // 普通构造函数  

247   String(const String &other); // 拷贝构造函数  

248   ~ String(void); // 析构函数  

249   String & operate =(const String &other); // 赋值函数  

250  private:  

251   char *m_data; // 用于保存字符串  

252 };  

253    

254 解答:  

255    

256    

257   

258 试题8:请说出staticconst关键字尽可能多的作用  

259 解答:  

260    

261    

262   

263 试题1:请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1  

264 解答:  

265    

266    

267    

268 试题2:写一个函数返回1+2+3++n的值(假定结果不会超过长整型变量的范围)  

269 解答  

270    

271    

272    

273   

274 试题3.不用第三变量交换两个数  

275    

276    

277    

278 试题4.求大数的阶乘例如100!,使用通常的做法会溢出,这里要使用数组的方法。例如:123*20 相当于 100*20 + 20*20+3*20  

279  1.设一棵完全二叉树有700个结点,则在该二叉树中有多少个叶子结点  

280    

281    

282 2.static 数据成员必须在类定义的外部定义。不象普通数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。  

283    

284    

285   

286 3.求函数返回值,输入x=9999;  

287 int func ( )  

288 {  

289 int countx = 0;  

290 while ( x )  

291 {  

292 countx ++;  

293 x = x&(x-1);  

294 }  

295 return countx;  

296 }  

297 输出为:  

298    

299    

300 4.分析下面的程序  

301 struct s1  

302 {  

303 int i: 8;  

304 int j: 4;  

305 int a: 3;  

306 double b;  

307 };  

308 struct s2  

309 {  

310 int i: 8;  

311 int j: 4;  

312 double b;  

313 int a:3;  

314 };  

315 printf("sizeof(s1)= %d\n"sizeof(s1));  

316 printf("sizeof(s2)= %d\n"sizeof(s2));  

317 result: 16, 24  

318 第一个struct s1  

319 {  

320 int i: 8;  

321 int j: 4;  

322 int a: 3;  

323 double b; };  

324    

325 5.在对齐为4的情况下 分析下面程序的结果  

326 struct BBB  

327 {  

328 long num;  

329 char *name;  

330 short int data;  

331 char ha;  

332 short ba[5];  

333 }*p;  

334 p=0x1000000;  

335 p+0x200=____;  

336 (Ulong)p+0x200=____;  

337 (char*)p+0x200=____;  

338    

339 6.分析一下下面程序的输出结果  

340 i nclude  

341 i nclude  

342 i nclude  

343 i nclude  

344 i nclude  

345 i nclude  

346 typedef struct AA  

347 {  

348          int b1:5;  

349          int b2:2;  

350 }AA;  

351 void main()  

352 {  

353         AA aa;  

354         char cc[100];  

355         strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");  

356         memcpy(&aa,cc,sizeof(AA));  

357         cout << aa.b1 <<endl;  

358         cout << aa.b2 <<endl;  

359 }  

360    

361   

362 7.改错:  

363 i nclude  

364 int main(void) {  

365      int **p;  

366      int arr[100];  

367      p = &arr;  

368      return 0;  

369 }  

370    

371    

372   

373 8.写一个内存拷贝函数,不用任何库函数.  

374    

375    

376 9.将一个数字字符串转换为数字."1234" -->1234  

377    

378    

379 10.写出运行结果  

380 #include  

381 #include  

382 #define STRCPY(a, b) strcpy(a##_p, #b)  

383 #define STRCPY1(a, b) strcpy(a##_p, b##_p)  

384 int main(void) {  

385         char var1_p[20];  

386         char var2_p[30];  

387         strcpy(var1_p, "aaaa");  

388         strcpy(var2_p, "bbbb");  

389         STRCPY1(var1, var2);  

390         STRCPY(var2, var1);  

391         printf("var1 = %s\n", var1_p);  

392         printf("var2 = %s\n", var2_p);  

393         return 0;  

394 }  

395    

396   

397 11:此题考查的是C的变长参数,就像标准函数库里printf()那样.  

398 #include  

399 int ripple ( int , ...);  

400 main()  

401 {  

402     int num;  

403     num = ripple ( 3, 5,7);  

404     printf( " %d" , num);  

405 }  

406    

407    

408 int ripple (int n, ...)  

409 {  

410     int i , j;  

411     int k;  

412     va_list p;  

413     k= 0; j = 1;  

414     va_start( p , n);  

415     for (; j  

416     {  

417         i = va_arg( p , int);  

418         for (; i; i &=i-1 )  

419             ++k;  

420     }  

421     return k;  

422 }  

423 这段程序的输出是:  

424 (a) 7 (b) 6 (c) 5 (d) 3  

425    

426    

427 12.要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234;  

428 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?  

429    

430    

431 13.C++中为什么用模板类  

432    

433    

434    

435 部分IT公司的笔试小算法题精选  

436 1、将一整数逆序后放入一数组中(要求递归实现)  

437    

438    

439 2、求高于平均分的学生学号及成绩(学号和成绩人工输入)  

440    

441 3、递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)  

442    

443    

444 4、组合问题(从M个不同字符中任取N个字符的所有组合)  

445    

446    

447 5、分解成质因数(435234=251*17*17*3*2,据说是华为笔试题)  

448    

449    

450 6、寻找迷宫的一条出路,o:通路; X:障碍。(大家经常谈到的一个小算法题)  

451    

452    

453 7、随机分配座位,共50个学生,使学号相邻的同学座位不能相邻(早些时候用C#写的,没有用C改写)。  

454    

455    

456 8、求网格中的黑点分布。现有6*7的网格,在某些格子中有黑点,已知各行与各列中有黑点的点数之和,请在这张网格中画出黑点的位置。(这是一网友提出的题目,说是他笔试时遇到算法题)  

457    

458    

459 9、有4种面值的邮票很多枚,这4种邮票面值分别1, 4, 12, 21,现从多张中最多任取5张进行组合,求取出这些邮票的最大连续组合值。(据说是华为2003年校园招聘笔试题)  

460    

461   

462 10、大整数数相乘的问题。(这是2002年在一考研班上遇到的算法题)  

463    

464    

465 11、求最大连续递增数字串(如“ads3sl456789DF3456ld345AA”中的“456789”)  

466    

467    

468 12、四个工人,四个任务,每个人做不同的任务需要的时间不同,求任务分配的最优方案。(2005529日全国计算机软件资格水平考试——软件设计师的算法题)。  

469    

470    

471 13、八皇后问题,输出了所有情况,不过有些结果只是旋转了90度而已。(回溯算法的典型例题,是数据结构书上算法的具体实现,大家都亲自动手写过这个程序吗?)  

472    

473    

474 14、实现strstr功能,即在父串中寻找子串首次出现的位置。(笔试中常让面试者实现标准库中的一些函数)  

475    

476    

477 15、现在小明一家过一座桥,过桥的时候是黑夜,所以必须有灯。现在小明过桥要1分,小明的弟弟要3分,小明的爸爸要6分,小明的妈妈要8分,小明的爷爷要12分。每次此桥最多可过两人,而过桥的速度依过桥最慢者而定,而且灯在点燃后30分就会熄灭。问小明一家如何过桥时间最短?(原本是个小小智力题,据说是外企的面试题,在这里用程序来求解)  

478    

479    

480 16200511月金山笔试题。编码完成下面的处理函数。函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)  

481    

482    

172005

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值