第一篇:IT公司筆試題總結(jié)
1.引用與指針有什么區(qū)別?
1.引用必須被初始化,指針不必。
2.引用初始化以后不能被改變,指針可以改變所指的對象。3.不存在指向空值的引用,但是存在指向空值的指針。
2.堆棧溢出一般是由什么原因?qū)е碌模?/p>
沒有回收垃圾資源。3.什么函數(shù)不能聲明為虛函數(shù)? constructor函數(shù)不能聲明為虛函數(shù)。4.寫出float x 與“零值”比較的if語句。if(x>0.000001&&x<-0.000001)
5.不能做switch()的參數(shù)類型是:
switch的參數(shù)不能為實型
6.頭文件中的 ifndef/define/endif干什么用? 預處理
答:防止頭文件被重復引用
7.#include
答:
對于#include
對于#include “filename.h”,編譯器從用戶的工作路徑開始搜索filename.h
8.在C++ 程序中調(diào)用被 C 編譯器編譯后的函數(shù),為什么要加 extern “C”聲明?
答:函數(shù)和變量被C++編譯后在符號庫中的名字與C語言的不同,被extern “C”修飾的變量和函數(shù)是按照C語言方式編譯和連接的。由于編譯后的名字不同,C++程序不能直接調(diào)用C 函數(shù)。C++提供了一個C 連接交換指定符號extern“C”來解決這個問題。
9.char str1[] = “abc”;
char str2[] = “abc”;
const char str3[] = “abc”;
const char str4[] = “abc”;
const char *str5 = “abc”;
const char *str6 = “abc”;
char *str7 = “abc”;
char *str8 = “abc”;
cout <<(str1 == str2)<< endl;cout <<(str3 == str4)<< endl;
cout <<(str5 == str6)<< endl;
cout <<(str7 == str8)<< endl;
結(jié)果是:0 0 1 1
str1,str2,str3,str4是數(shù)組變量,它們有各自的內(nèi)存空間;而str5,str6,str7,str8是指針,它們指向相同的常量區(qū)域。
10.main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf(“%d,%d”,*(a+1),*(ptr-1));
}
答:2,5
*(a+1)就是a[1],*(ptr-1)就是a[4], 執(zhí)行結(jié)果是2, 5。&a+1不是首地址+1,系統(tǒng)會認為加一個a數(shù)組的偏移,是偏移了一個數(shù)組的大小(本例是5個int)。int *ptr=(int *)(&a+1);則ptr實際是&(a[5]),也就是a+5
原因如下:
&a 是數(shù)組指針,其類型為 int(*)[5];而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同;a是長度為5的int數(shù)組指針,所以要加 5*sizeof(int)。所以ptr實際是a[5]。但是prt與(&a+1)類型是不一樣的(這點很重要),所以prt-1只會減去 sizeof(int*)。a,&a的地址是一樣的,但意思不一樣,a是數(shù)組首地址,也就是a[0]的地址,&a是對象(數(shù)組)首地 址,a+1是數(shù)組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5]。
11.交換兩個變量的值,不使用第三個變量。即a=3,b=5,交換之后a=5,b=3;
答:有兩種解法, 一種用算術(shù)算法, 一種用^(異或)
a = a + b;
b = a – b;
a = a – b;
or
a = a^b;// 只能對int,char..b = a^b;
a = a^b;
or
a ^= b ^= a;
12.列舉幾種進程的同步機制,并比較其優(yōu)缺點。
答:原子操作、信號量機制、自旋鎖、管程、會合、分布式系統(tǒng)
13.進程死鎖的原因和4個必要條件
答:資源競爭及進程推進順序非法;互斥、請求保持、不可剝奪、環(huán)路
14.要對絕對地址0×100000賦值,我們可以用(unsigned int*)0×100000 = 1234;那么要是想讓程序跳轉(zhuǎn)到絕對地址是0×100000去執(zhí)行,應該怎么做?
答:*((void(*)())0×100000)();
首先要將0×100000強制轉(zhuǎn)換成函數(shù)指針,即:(void(*)())0×100000。然后再調(diào)用它: *((void(*)())0×100000)();用typedef可以看得更直觀些:
typedef void(*)()voidFuncPtr;
*((voidFuncPtr)0×100000)();
15.unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0×801000;
p2=(unsigned long *)0×810000;
請問
p1+5=______;
p2+5=______;
答案:801005;810014。不要忘記了這個是16進制的數(shù)字,p2要加20變?yōu)?6進制就是14
16、設(shè)有以下說明和定義:
typedef union {long i;int k[5];char c;} DATE;
struct data { int cat;DATE cow;double dog;} too;DATE max;
則語句 printf(“%d”,sizeof(too)+sizeof(max));的執(zhí)行結(jié)果是:______
答:DATE是一個union, 變量公用空間.里面最大的變量類型是int[5], 占用20個字節(jié).所以它的大小是20
data是一個struct, 每個變量分開占用空間.依次為int4 + DATE20 + double8 = 32.所以結(jié)果是 20 + 32 = 52.當然?在某些16位編輯器下, int可能是2字節(jié),那么結(jié)果是 int2 + DATE10 + double8 = 20 1.代碼找錯題(題目1)
void test1(){ char string[10];char* str1=“0123456789”;strcpy(string, str1);} 代碼找錯題(題目2)
void test2(){ char string[10], str1[10];for(I=0;I<10;I++){ str1[i] ='a';} strcpy(string, str1);} 代碼找錯題(題目3)
Void test3(char* str1)
{
char string[10];
if(strlen(str1)<= 10)
{
strcpy(string, str1);
}
}
在swap函數(shù)中,p是一個“野”指針,有可能指向系統(tǒng)區(qū),導致程序運行的崩潰。在VC++中DEBUG運行時提示錯誤“Access Violation”。該程序應該改為:
解答:
test1: 字符串str1需要11個字節(jié)才能存放下(包括末尾的'