天天看點

c++面試題 整理

第一題:const 符号常量;

(1)const char *p

(2)char const *p

(3)char * const p

說明上面三種描述的差別;

如果const位于星号的左側,則const就是用來修飾指針所指向的變量,即指針指向為常量;

如果const位于星号的右側,const就是修飾指針本身,即指針本身是常量。

第二題:

下面是C語言中兩種if語句判斷方式。請問哪種寫法更好?為什麼?

 int n;

 if (n == 10) // 第一種判斷方式

 if (10 == n) // 第二種判斷方式

如果少了個=号,編譯時就會報錯,減少了出錯的可能行,可以檢測出是否少了=

第三題:

void DoSomeThing(...)

{

 char* p;

 ...

 p = malloc(1024);  // 配置設定1K的空間

 if (NULL == p)

  return;

 ...

 p = realloc(p, 2048); // 空間不夠,重新配置設定到2K

 if (NULL == p)

  return;

 ...

}

A:

p = malloc(1024);     應該寫成: p = (char *) malloc(1024);

        沒有釋放p的空間,造成記憶體洩漏。

第四題:

Void test1()

{

 char string[10];

 char *str1="0123456789";

 strcpy(string, str1);

}

數組越界

第五題:

下面代碼有什麼問題?

Void test3(char* str1)

{

  char string[10];

  if(strlen(str1)<=10)

  {

    strcpy(string, str1);

  }

}

==數組越界

==strcpy拷貝的結束标志是查找字元串中的/0 是以如果字元串中沒有遇到/0的話 會一直複制,直到遇到/0,上面的

第六題:

寫出運作結果:

{// test1

    char str[] = "world"; cout << sizeof(str) << ": ";

    char *p    = str;     cout << sizeof(p) << ": ";

    char i     = 10;      cout << sizeof(i) << ": ";

    void *pp   = malloc(10);  cout << sizeof(p) << endl;

}

    指針大小時4,

6:4:1:4

第七題:

如何判斷一個作業系統是16位還是32位的?不能用sizeof()函數

A1:

16位的系統下,

int i = 65536;

cout << i; // 輸出0;

int i = 65535;

cout << i; // 輸出-1;

32位的系統下,

int i = 65536;

cout << i; // 輸出65536;

int i = 65535;

cout << i; // 輸出65535;

第八題:

.下面的函數實作在一個固定的數上加上一個數,有什麼錯誤,改正

int add_n(int n)

{

  static int i=100;

  i+=n;

  return i;

}

答:

因為static使得i的值會保留上次的值。

去掉static就可了

第九題:

程序間通信的方式有?

程序間通信的方式有 共享記憶體, 管道 ,Socket ,消息隊列 , DDE等

第十題:

void main()

{

        int i=60;

        int j=50;

        i=i+j;

        j=i-j;

        i=i-j;

        printf("i=%d/n",i);

        printf("j=%d/n",j);

}

方法三:

// 用加減實作,而且不會溢出

a = a+b-(b=a)

第十一題:VC中提供了#pragma pack(n)來設定變量以n位元組對齊方式。n位元組對齊就是說變量存放的起始位址的偏移量有兩種情況:第一、如果n大于等于該變量所占用的位元組數,那麼偏移量必須滿足預設的對齊方式,第二、如果n小于該變量的類型所占用的位元組數,那麼偏移量為n的倍數,不用滿足預設的對齊方式。結構的總大小也有個限制條件,分下面兩種情況:如果n大于所有成員變量類型所占用的位元組數,那麼結構的總大小必須為占用空間最大的變量占用的空間數的倍數;

第十二題:A.  參數為資料類型或者為一般變量。例如sizeof(int),sizeof(long)等等。這種情況要注意的是不同系統系統或者不同編譯器得到的結果可能是不同的。例如int類型在16位系統中占2個位元組,在32位系統中占4個位元組。

B.  參數為數組或指針。下面舉例說明.

int a[50];  //sizeof(a)=4*50=200; 求數組所占的空間大小

int *a=new int[50];// sizeof(a)=4; a為一個指針,sizeof(a)是求指針

                   //的大小,在32位系統中,當然是占4個位元組。

C.  參數為結構或類。Sizeof應用在類和結構的處理情況是相同的。但有兩點需要注意,第一、結構或者類中的靜态成員不對結構或者類的大小産生影響,因為靜态變量的存儲位置與結構或者類的執行個體位址無關。

第二、沒有成員變量的結構或類的大小為1,因為必須保證結構或類的每一

個執行個體在記憶體中都有唯一的位址。

Class Test{int a;static double c};//sizeof(Test)=4.

Test *s;//sizeof(s)=4,s為一個指針。

Class test1{ };//sizeof(test1)=1;

第十三題:i最後等于多少?

int i = 1;

int j = i++;

if((i>j++) && (i++ == j)) i+=j;

答:

i = 5

第十四題:main

主函數執行完畢後,是否可能會再執行一段代碼

當然有,使用者自定義類型的全局變量和一些類裡面的靜态成員都需要析構,這些工作是在main()

函數結束以後做的

 第十五題:引用與指針有什麼差別?

1)

引用必須被初始化,指針不必。

2)

引用初始化以後不能被改變,指針可以改變所指的對象。

3)

不存在指向空值的引用,但是存在指向空值的指針。

繼續閱讀