1. 程式人生 > >C語言經典問題學習筆記之二

C語言經典問題學習筆記之二

1. 請你談談引用和指標的區別。

參考答案

1)引用被建立的同時必須被初始化(指標則可以在任何時候被初始化) 。

2)不能有 NULL 引用,引用必須與合法的儲存單元關聯(指標則可以是NULL) 。

3)一旦引用被初始化,就不能改變引用的關係(指標則可以隨時改變所指的物件) 。

2.

void getmemory(char *p)
{
  p=(char *)
malloc(100);
 
strcpy(p,“hello world”);
}
int main( )
{
  char *
str=NULL;
 
getmemory(str);
 
printf(“%s/n”,str);
  free(
str);
  return 0;
}
會出現什麼問題?

標準答案程式崩潰,getmemory中的malloc不能返回動態記憶體,即形參p是接收的str的地址,而在malloc的過程中,p的值發生了變化,而str的內容還是原來的NULL/

3.

charszstr[10];
strcpy(szstr,"0123456789");
產生什麼結果?為什麼?   【標準答案長度不一樣,出現段錯誤。 4. 陣列和連結串列的區別?

標準答案

陣列:資料順序儲存,固定大小;連結串列:資料可以隨機儲存,大小可動態改變

5.

void main()
    {
  char
aa[10];
 
printf
(“%d”,strlen(aa));
    }                                                                                                     
會出現什麼問題?列印結果是是多少?

標準答案sizeof()和初不初始化,沒有關係,strlen()和初始化有關,列印結果值未知。

6.

給定結構struct A
        {
  char t:4;
  char k:4;
  unsigned short i:8;
  unsigned long m;
         };

sizeof(A) = ?

標準答案】8

7.

struct name1{
                 char
str;
                 short x;
                
int num;
                }

   求sizeof(name1)?

標準答案】8

8.

struct name2{
  char
str;
 
int num;
  short x;
     };
sizeof(name2)

標準答案】12

9.

程式哪裡有錯誤

wap( int*p1,int* p2 )

  {

int *p;

         *p = *p1;

         *p1 = *p2;

         *p2 = *p;

  }

標準答案】p為野指標

10.

(void*)ptr(*(void**))ptr的結果是否相同?其中ptr為同一個指標。

標準答案】(void*)ptr(*(void**))ptr值是相同的

11.

要求設定一絕對地址為0x67a9的整型變數的值為0xaa66   【標準答案

int *ptr;
     
ptr = (int*)0x67a9;
      *
ptr = 0xaa55;

      *(int * const)(0x67a9) = 0xaa55;

12.

要對絕對地址0x100000賦值,我們可以用(unsigned int*)0x100000= 1234;那麼要是想讓程式跳轉到絕對地址是0x100000去執行,應該怎麼做?   【標準答案

      *((void (*)( ))0x100000 ) ();
首先要將0x100000強制轉換成函式指標,:
      (void (*)())0x100000
然後再呼叫它:
      *((void (*)())0x100000)();

13.

inta,b,c請寫函式實現c=a+b ,不可以改變資料型別,如將c改為long int,關鍵是如何處理溢位問題

  【標準答案】                                                                                    bool add (inta, intb,int *c)
{
  *c=
a+b;
  return (a>0 && b>0&&(*c<a || *c<b) || (a<0 && b<0&&(*c>a|| *c>b)));
}

14.

標頭檔案中的ifndef/define/endif幹什麼用?

標準答案防止該標頭檔案被重複引用。  

15.

關鍵字volatile有什麼含意?並給出三個不同的例子。 參考答案 一個定義為volatile的變數是說這變數可能會被意想不到地改變,這樣,編譯器就不會去假設這個變數的值了。精確地說就是,優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器裡的備份。下面是volatile變數的幾個例子:1). 並行裝置的硬體暫存器(如:狀態暫存器)2). 一箇中斷服務子程式中會訪問到的非自動變數(Non-automaticvariables) 
3).
多執行緒應用中被幾個任務共享的變數

16.

 #include  <filename.h>    和  #include  “filename.h”  有什麼區別?

標準答案對於#include  <filename.h,編譯器從標準庫路徑開始搜尋filename.h ;                               對於#include  “filename.h” ,編譯器從使用者的工作路徑開始搜尋 filename.h

17.

const有什麼用途?(請至少說明兩種)

標準答案

 (1)可以定義const常量               

2const可以修飾函式的引數、返回值,甚至函式的定義體。被 const修飾的東西都受到強制保護,可以預防意外的變動,能提高程式的健壯性。  

18.

下面的宣告都是什麼意思?

constint    a;
     
intconst    a;
     
constint    *a;
     
int * const  a;
     
intconst * a const;

  【標準答案

兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指向常整型數的指標(也就是,整型數是不可修改的,但指標可以)。 第四個意思a是一個指向整型數的常指標(也就是說,指標指向的整型數是可以修改的,但指標是不可修改的)。最後一個意味著a是一個指向常整型數的常指標(也就是說,指標指向的整型數是不可修改的,同時指標也是不可修改的

19.

Heapstack的差別。

標準答案】Heap是堆,stack是棧。Stack的空間由作業系統自動分配/釋放

 Heap上的空間手動分配/釋放。Stack空間有限,Heap是很大的自由儲存區

C中的malloc函式分配的記憶體空間即在堆上,C++中對應的是new操作符。程式在編譯期對變數和函式分配記憶體都在棧上進行,且程式執行過程中函式呼叫時引數的傳遞也在棧上進行。

20.

程式的區域性變數存在於___中,全域性變數存在於____中,動態申請資料存在於___中。

標準答案程式的區域性變數存在於(stack)中,全域性變數存在於靜態資料區 中,動態申請資料存在於堆(heap中。

21.

堆疊溢位一般是由什麼原因導致的? 標準答案沒有回收垃圾資源。

22.

佇列和棧有什麼區別?

標準答案佇列先進先出,棧後進先出。

23.

用預處理指令#define 宣告一個常數,用以表明1年中有多少秒(忽略閏年問題) 參考答案】#defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 

24.

用巨集定義寫出swapxy),即交換兩數。    【標準答案】                                                     #define swap(x, y)(x)=(x)+(y);(y)=(x)–(y);(x)=(x)–(y);

25.

寫一個標準巨集,這個巨集輸入兩個引數並返回較小的一個。

標準答案】#defineMin(X, Y) ((X)>(Y)?(Y):(X))//結尾沒有;

26.

以下是求一個數的平方的程式,請找出錯誤:
   
#defineSQUARE(a)((a)*(a))
     
int a=5;
     
int b;
      b=SQUARE(a++);

標準答案巨集在預編譯時會以替換的形式展開,僅僅會替換。涉及到巨集的地方,不要用++ --,標準中對此沒有規定,因此最終結果將會依賴於不同的編譯器。執行程式的答案可能是25、也有可能是36

27.

給定一個整型變數a,寫兩段程式碼,第一個設定abit 3,第二個清除a bit 3。在以上兩個操作中,要保持其它位不變。

標準答案

#define BIT3     (0x1 <<3)
static
inta;
void set_bit3(void)               voidclear_bit3(void)
{                                          {

     a |= BIT3;                             a &=~BIT3;
}                                           }

28.

關鍵字volatile有什麼含意? 標準答案提示編譯器物件的值可能在編譯器未監測到的情況下改變。