c 面試題

1、運行下圖中c代碼,輸出的結果是什麼?

[cpp]
int main(int argc, char** argv[]) 

  char str1[] = "hello world"; 
  char str2[] = "hello world"; 

  char* str3 = "hello world"; 
  char* str4 = "hello world"; 

  if(str1 == str2) 
  printf("str1 and str2 are same.\n"); 
  else 
  printf("str1 and str2 are not same.\n"); 

  if(str3 == str4) 
  printf("str3 and str4 are same.\n"); 
  else 
  printf("str3 and str4 are not same.\n"); 

  return 0; 

int main(int argc, char** argv[])
{
  char str1[] = "hello world";
  char str2[] = "hello world";
 
  char* str3 = "hello world";
  char* str4 = "hello world";
 
  if(str1 == str2)
  printf("str1 and str2 are same.\n");
  else
  printf("str1 and str2 are not same.\n");
 
  if(str3 == str4)
  printf("str3 and str4 are same.\n");
  else
  printf("str3 and str4 are not same.\n");
 
  return 0;
}
答案:輸出兩行。第一行是str1 and str2 are not same,第二行是str3 and str4 are same。

str1和str2是兩個字元串數組。我們會為它們分配兩個長度為12個位元組的空間,並把"hello world"的內容分別拷貝到數組中去。這是兩個初始地址不同的數組,因此比較str1和str2的值,會不相同。str3和str4是兩個指針,我們無需為它們分配記憶體以存儲字元串的內容,而只需要把它們指向"hello world“在記憶體中的地址就可以了。由於"hello world”是常量字元串,它在記憶體中只有一個拷貝,因此str3和str4指向的是同一個地址。因此比較str3和str4的值,會是相同的。

2、運行下圖中的c++代碼,列印出的結果是什麼?

[cpp]
int fun1(char* str) 

  printf("%s\n", str); 
  return 0; 


int fun2(char* str) 

  printf("%s\n", str); 
  return 1; 


int main(int argc, char ** argv[]) 

  int res1, res2; 
  res1 = (fun1("a") && fun2("b")) || (fun1("c") || fun2("d")); 
  res2 = (fun1("a") && fun2("b")) && (fun1("c") || fun2("d")); 

  return res1 || res2; 

int fun1(char* str)
{
  printf("%s\n", str);
  return 0;
}
 
int fun2(char* str)
{
  printf("%s\n", str);
  return 1;
}
 
int main(int argc, char ** argv[])
{
  int res1, res2;
  res1 = (fun1("a") && fun2("b")) || (fun1("c") || fun2("d"));
  res2 = (fun1("a") && fun2("b")) && (fun1("c") || fun2("d"));
 
  return res1 || res2;
}
答案:列印出4行,分別是a、c、d、a。
在c/c++中,與、或運算是從左到右的順序執行的。在計算rest1時,先計算fun1(“a”) && func2(“b”)。首先func1(“a”)列印出內容為a的一行。由於fun1(“a”)返回的是false, 無論func2(“b”)的返回值是true還是false,fun1(“a”) && func2(“b”)的結果都是false。由於func2(“b”)的結果無關重要,因此func2(“b”)會略去而不做計算。接下來計算 fun1(“c”) || func2(“d”),分別列印出內容c和d的兩行。

在計算rest2時,首先func1(“a”)列印出內容為a的一行。由於func1(“a”)返回false,和前面一樣的道理,func2(“b”)會略去不做計算。由於fun1(“a”) && func2(“b”)的結果是false,不管fun1(“c”) && func2(“d”)的結果是什麼,整個表達式得到的結果都是false,因此fun1(“c”) && func2(“d”)都將被忽略。

3、

[cpp]
int sizeof(char pstring[]) 

  return sizeof(pstring); 


int main(int argc, char ** argv[]) 

  char* pstring1 = "google"; 
  int size1 = sizeof(pstring1); 
  int size2 = sizeof(*pstring1); 

  char pstring2[100] = "google"; 
  int size3 = sizeof(pstring2); 
  int size4 = sizeof(pstring2); 

  printf("%d, %d, %d, %d", size1, size2, size3, size4); 

  return 0; 

int sizeof(char pstring[])
{
  return sizeof(pstring);
}
 
int main(int argc, char ** argv[])
{
  char* pstring1 = "google";
  int size1 = sizeof(pstring1);
  int size2 = sizeof(*pstring1);
 
  char pstring2[100] = "google";
  int size3 = sizeof(pstring2);
  int size4 = sizeof(pstring2);
 
  printf("%d, %d, %d, %d", size1, size2, size3, size4);
 
  return 0;
}
答案:4, 1, 100, 4。pstring1是一個指針。在32位機器上,任意指針都占4個位元組的空間。*pstring1是字元串pstring1的第一個字元。一個字元占一個位元組。pstring2是一個數組,sizeof(pstring2)是求數組的大小。這個數組包含100個字元,因此大小是100個位元組。而在函式 sizeof中,雖然傳入的參數是一個字元數組,當數組作為函式的參數進行傳遞時,數組就自動退化為同類型的指針。

4.  引用與指針有什麼區別?
1) 引用必須被初始化,指針不必。
2) 引用初始化以後不能被改變,指針可以改變所指的對象。
2) 不存在指向空值的引用,但是存在指向空值的指針。

5.  描述實時系統的基本特性
在特定時間內完成特定的任務,實時性與可靠性
6.  全局變數和局部變數在記憶體中是否有區別?如果有,是什麼區別?
全局變數儲存在靜態資料庫,局部變數在堆疊
7. 什麼是平衡二叉樹?
左右子樹都是平衡二叉樹 且左右子樹的深度差值的絕對值不大於1
8. 堆疊溢出一般是由什麼原因導致的?
沒有回收垃圾資源
9. 什麼函式不能聲明為虛函式?
constructor
10. 冒泡排序算法的時間複雜度是什麼?
o(n^2)
11. 寫出float x 與“零值”比較的if語句。
if(x>0.000001&&x<-0.000001)
12. internet採用哪種網路協定?該協定的主要層次結構?
tcp/ip 套用層/傳輸層/網路層/數據鏈路層/物理層
13. internet物理地址和ip地址轉換採用什麼協定?
arp (address resolution protocol)(地址解析協議)
14. ip地址的編碼分為哪倆部分?
ip地址由兩部分組成,網路號和主機號。不過是要和“子網掩碼”按位與上之後才能區分哪些是網路位哪些是主機位。