C/C++面試題(一)

 

1、局部變量能否和全局變量重名?

  答:能,局部會屏蔽全局。局部變量可以與全局變量同名,在函數內引用這個變量時,會用到同名的局部變量,而不會用到全局變量。對於有些編譯器而言,在同一個函數內可以定義多個同名的局部變量,比如在兩個循環體內都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環體內。

 

2、如何引用一個其它文件已經定義過的全局變量?

  答:可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個編寫錯了,那麼在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那麼在編譯期間不會報錯,而在連接期間報錯。

 

3、用變量a給出下面的定義

  a) 一個整型數
b)一個指向整型數的指針
c)一個指向指針的的指針,它指向的指針是指向一個整型數
d)一個有10個整型數的數組
e) 一個有10個指針的數組,該指針是指向一個整型數的
f) 一個指向有10個整型數數組的指針
g) 一個指向函數的指針,該函數有一個整型參數並返回一個整型數
h) 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數

3、用變量a給出下面的定義_

答案是:

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer

d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int); // A pointer to a function a that takes an integer          argument and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functions that   take an integer argument and return an integer

 

a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
 
指針的數據類型
定義含義
int  i;    定義整形變量i
int  *p;    p爲指向整形數據的指針變量
int  a[n];    定義整形數組a, 它有n個元素
int *p[n];    定義指針數組p, 它由n個指向整形數據的指針元素組成
int  (*p)[n];    p爲指向含n個元素的一維數組的指針變量
int f();    f爲帶回整形函數值的函數
int *p();    p爲帶回一個指針的函數,該指針指向整形數據
int (*p)();    p爲指向函數的指針,該函數返回一個整形值
int **p;    p是一個指針變量,它指向一個指向 整形數據的指針變量
  
 

4、關鍵字static的作用是什麼?

1)在函數體,一個被聲明爲靜態的變量在這一函數被調用過程中維持其值不變。

2) 在模塊內(但在函數體外),一個被聲明爲靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。

3) 在模塊內,一個被聲明爲靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地範圍內使用。

 

5、關鍵字const有什麼含意?

  const意味着“只讀”。另外,const可以使編譯器很自然地保護那些不希望被改變的變量或參數(用const修飾),防止其被無意的代碼修改。

 

下面的聲明都是什麼意思?

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

 

6、關鍵字volatile有什麼含意?

  一個定義爲volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器裏的備份。

  1) 並行設備的硬件寄存器(如:狀態寄存器);

  2) 一箇中斷服務子程序中會訪問到的非自動變量(Non-  automatic variables);

  3) 多線程應用中被幾個任務共享的變量。

 

7、全局變量可不可以定義在可被多個.C文件包含的頭文件中?爲什麼?

  可以,在不同的C文件中以static形式來聲明同名全局變量。在不同的C文件中聲明同名的全局變量,前提是其中只能有一個C文件中對此變量賦初值,此時連接不會出錯。

 

8、設有以下說明和定義:

typedef union{

  long i;

  int k[5];

  char c;

} DATE;

struct data{

  int cat;

  DATE cow;

  double dog;

} too;

DATE max;

則語句printf("%d",sizeof(struct data)+sizeof(max));的執行結果是:___

9、請找出下面代碼中的所有錯誤(說明:以下代碼是把一個字符串倒序,如“abcd”倒序後變爲“dcba”)

#include"string.h"

int main(){

  char*src="hello,world";

  char* dest=NULL;

  intlen=strlen(src);

  dest=(char*)malloc(len);

  char* d=dest;

  char* s=src[len];

  while(len--!=0){

  *d=*s--;

             d++;}

  printf("%s",dest);

  return 0;

}

 

10、隊列和棧有什麼區別?

11
、對於一個頻繁使用的短小函數,C語言中應用什麼實現,C++中應用什麼實現?

12
、軟件測試都有那些種類?

13
、確定模塊的功能和模塊的接口是在軟件設計的哪個階段完成的?

14、計算表達式值?

unsigned char *p1;

unsigned int *p2;

p1=(unsigned char *)0x801000;

p2=(unsigned int *)0x810000;

請問:

       p1+5=  ;

       p2+5=  ;

 

15、進程和線程的差別?

線程是指進程內的一個執行單元,也是進程內的可調度實體。線程與進程的區別:

(1)調度:線程作爲調度和分配的基本單位,進程作爲擁有資源的基本單位;

(2)併發性:不僅進程之間可以併發執行,同一個進程的多個線程之間也可併發執行;

(3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬於進程的資源;

(4)系統開銷:在創建或撤消進程時,由於系統都要爲之分配和回收資源,導致系統的開銷明顯大於創建或撤消線程時的開銷。

 

16Heapstack的差別。

Heap是堆,stack是棧。

Stack的空間由操作系統自動分配/釋放,Heap上的空間手動分配/釋放。

Stack空間有限,Heap是很大的自由存儲區

C中的malloc函數分配的內存空間即在堆上,C++中對應的是new操作符。

程序在編譯期對變量和函數分配內存都在棧上進行,且程序運行過程中函數調用時參數的傳遞也在棧上進行。

 

17、解釋下列輸出結果

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;

18、以下代碼中的兩個sizeof用法有問題嗎?

void UpperCase( char str[] ) // 將小寫字母轉換成大寫字母

{

  for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )

  if( 'a'<=str && str<='z' )

  str -= ('a'-'A' );

}

char str[] = "aBcDe";

cout << "str字符長度爲: " << sizeof(str)/sizeof(str[0]) << endl;

UpperCase( str );

cout << str << endl;

 

18、以下代碼中的兩個sizeof用法有問題嗎?

函數內的sizeof有問題。根據語法,sizeof如用於數組,只能測出靜態數組的大小,無法檢測動態分配的或外部數組大小。函數外的str是一個靜態定義的數組,因此其大小爲6,函數內的str實際只是一個指向字符串的指針,沒有任何額外的與數組相關的信息,因此sizeof作用於上只將其當指針看,一個指針爲4個字節,因此返回4。

注意:數組名作爲函數參數時,退化爲指針.

數組名作爲sizeof()參數時,數組名不退化,因爲sizeof不是函數.

 

19、指出下面代碼的輸出,並解釋爲什麼?

main()

{

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

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

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

}

   &a是數組指針,其類型爲int (*)[5]&a+1不是首地址+1,系統會認爲加一個a數組的偏移,是偏移了一個數組的大小,即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]

 

 

 

 

 

20、請問以下代碼有什麼問題?

int main()

   {

  char a;

  char *str=&a;

  strcpy(str,"hello");

  printf(str);

  return 0;

  }

 

沒有爲str分配內存空間,將會發生異常

問題出在將一個字符串複製進一個字符變量指針所指地址。雖然可以正確輸出結果,但因爲越界進行內在讀寫而導致程序崩潰。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章