笔试总结1
1. 引用與指針有什么區別?
1) 引用必須被初始化,指針不必。
沒有回收垃圾資源。
3. 什么函數不能聲明為虛函數?
constructor函數不能聲明為虛函數。
4. 寫出float x 與“零值”比較的if語句。
if(x>0.000001&&x<-0.000001)
5. 不能做switch()的參數類型是:
switch的參數不能為實型
6. 頭文件中的 ifndef/define/endif干什么用? 預處理
答:防止頭文件被重復引用
7. #include <filename.h>和 #include "filename.h" 有什么區別?
答:
#include<filename.h>系統檢索頭文件時 會先從系統文件里開始找
,再找其他地方。用于系統文件較快。
#include"filename.h"系統檢索頭文件時先從程序所處目錄開始查找。
用于自定義文件較快。
8. 在C++ 程序中調用被 C 編譯器編譯后的函數,為什么要加 extern “C”聲明?
答:函數和變量被C++編譯后在符號庫中的名字與C語言的不同,被extern "C"修飾的變量和函數是按照C語言方式編譯和連接的。由于編譯后的名字不同,C++程序不能直接調用C 函數。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;
結果是:0 0 1 1
str1,str2,str3,str4是數組變量,它們有各自的內存空間;而str5,str6,str7,str8是指針,它們指向相同的常量區域。
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], 執行結果是2, 5。&a+1不是首地址+1,系統會認為加一個a數組的偏移,是偏移了一個數組的大小(本例是5個int)。int *ptr=(int *)(&a+1); 則ptr實際是&(a[5]),也就是a+5
原因如下:
&a是數組指針,其類型為 int (*)[5]; 而指針加1要根據指針類型加上一定的值,不同類型的指針+1之后增加的大小不同; a是長度為5的int數組指針,所以要加 5*sizeof(int)。所以ptr實際是a[5]。但是prt與(&a+1)類型是不一樣的(這點很重要),所以prt-1只會減去sizeof(int*)。a,&a的地址是一樣的,但意思不一樣,a是數組首地址,也就是a[0]的地址,&a是對象(數組)首地址,a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5]。
11. 交換兩個變量的值,不使用第三個變量。即a=3,b=5,交換之后a=5,b=3;
答:有兩種解法, 一種用算術算法, 一種用^(異或)
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. 列舉幾種進程的同步機制,并比較其優缺點。
答:原子操作、信號量機制、自旋鎖、管程、會合、分布式系統
13. 進程死鎖的原因和4個必要條件
答:資源競爭及進程推進順序非法;互斥、請求保持、不可剝奪、環路
14. 要對絕對地址0x100000賦值,我們可以用(unsigned int*)0x100000 = 1234; 那么要是想讓程序跳轉到絕對地址是0x100000去執行,應該怎么做?
答:*((void (*)( ))0x100000 ) ( );
首先要將0x100000強制轉換成函數指針,即: (void (*)())0x100000。然后再調用它: *((void (*)())0x100000)(); 用typedef可以看得更直觀些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();
15.
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
請問
p1+5=______;
p2+5=______;
答案:801005;810014。不要忘記了這個是16進制的數字,p2要加20變為16進制就是14
16、設有以下說明和定義:
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));的執行結果是:______
答:DATE是一個union, 變量公用空間. 里面最大的變量類型是int[5], 占用20個字節. 所以它的大小是20
data是一個struct, 每個變量分開占用空間. 依次為int4 + DATE20 + double8 = 32.
所以結果是 20 + 32 = 52.
當然...在某些16位編輯器下, int可能是2字節,那么結果是 int2 + DATE10 + double8 = 20
1) 引用必須被初始化,指針不必。
2) 引用初始化以后不能被改變,指針可以改變所指的對象。
3) 不存在指向空值的引用,但是存在指向空值的指針。
2. 堆棧溢出一般是由什么原因導致的?沒有回收垃圾資源。
3. 什么函數不能聲明為虛函數?
constructor函數不能聲明為虛函數。
4. 寫出float x 與“零值”比較的if語句。
if(x>0.000001&&x<-0.000001)
5. 不能做switch()的參數類型是:
switch的參數不能為實型
6. 頭文件中的 ifndef/define/endif干什么用? 預處理
答:防止頭文件被重復引用
7. #include <filename.h>和 #include "filename.h" 有什么區別?
答:
#include<filename.h>系統檢索頭文件時 會先從系統文件里開始找
,再找其他地方。用于系統文件較快。
#include"filename.h"系統檢索頭文件時先從程序所處目錄開始查找。
用于自定義文件較快。
8. 在C++ 程序中調用被 C 編譯器編譯后的函數,為什么要加 extern “C”聲明?
答:函數和變量被C++編譯后在符號庫中的名字與C語言的不同,被extern "C"修飾的變量和函數是按照C語言方式編譯和連接的。由于編譯后的名字不同,C++程序不能直接調用C 函數。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;
結果是:0 0 1 1
str1,str2,str3,str4是數組變量,它們有各自的內存空間;而str5,str6,str7,str8是指針,它們指向相同的常量區域。
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], 執行結果是2, 5。&a+1不是首地址+1,系統會認為加一個a數組的偏移,是偏移了一個數組的大小(本例是5個int)。int *ptr=(int *)(&a+1); 則ptr實際是&(a[5]),也就是a+5
a,&a的地址是一樣的,但意思不一樣,a是數組首地址,也就是a[0]的地址,&a是對(數組)首地址,a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5].
原因如下:
&a是數組指針,其類型為 int (*)[5]; 而指針加1要根據指針類型加上一定的值,不同類型的指針+1之后增加的大小不同; a是長度為5的int數組指針,所以要加 5*sizeof(int)。所以ptr實際是a[5]。但是prt與(&a+1)類型是不一樣的(這點很重要),所以prt-1只會減去sizeof(int*)。a,&a的地址是一樣的,但意思不一樣,a是數組首地址,也就是a[0]的地址,&a是對象(數組)首地址,a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5]。
11. 交換兩個變量的值,不使用第三個變量。即a=3,b=5,交換之后a=5,b=3;
答:有兩種解法, 一種用算術算法, 一種用^(異或)
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. 列舉幾種進程的同步機制,并比較其優缺點。
答:原子操作、信號量機制、自旋鎖、管程、會合、分布式系統
13. 進程死鎖的原因和4個必要條件
答:資源競爭及進程推進順序非法;互斥、請求保持、不可剝奪、環路
14. 要對絕對地址0x100000賦值,我們可以用(unsigned int*)0x100000 = 1234; 那么要是想讓程序跳轉到絕對地址是0x100000去執行,應該怎么做?
答:*((void (*)( ))0x100000 ) ( );
首先要將0x100000強制轉換成函數指針,即: (void (*)())0x100000。然后再調用它: *((void (*)())0x100000)(); 用typedef可以看得更直觀些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();
15.
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
請問
p1+5=______;
p2+5=______;
答案:801005;810014。不要忘記了這個是16進制的數字,p2要加20變為16進制就是14
16、設有以下說明和定義:
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));的執行結果是:______
答:DATE是一個union, 變量公用空間. 里面最大的變量類型是int[5], 占用20個字節. 所以它的大小是20
data是一個struct, 每個變量分開占用空間. 依次為int4 + DATE20 + double8 = 32.
所以結果是 20 + 32 = 52.
當然...在某些16位編輯器下, int可能是2字節,那么結果是 int2 + DATE10 + double8 = 20
總結
- 上一篇: 面试中经常出现的算法2(整理)
- 下一篇: 笔试总结2(整理 觉得比较好的)