面試經典題之C語言

2021-10-03 14:09:04 字數 3861 閱讀 8738

問題一

int a[5]

=;int* ptr =

(int*)

(&a +1)

;printf

("%d,%d",*

(a +1)

,*(ptr -1)

);

不難看出,&a 得到的是 int(* )[5]。這時ptr已經又上面被強轉成被int* 了是乙個陣列指標,+1後即ptr 的指向應該是 5 後面的乙個元素。

由於a+1時a被轉換成了指標指向這個陣列的首元素位址,+1後指向2這個元素的位址,故解引用後得到2。而ptr-1後指向5這個元素的位址,解引用後得到元素5。所以這個列印出來的答案為2, 5。

問題二

struct test

;struct test* p =

(struct test*

)0x100000

;printf

("%p\n"

, p +

0x1)

;printf

("%p\n",(

unsigned

long

)p +

0x1)

;printf

("%p\n",(

unsigned

int*

)p +

0x1)

;

值得注意的時這個結構體的大小為20個位元組。

所以p+0x1即為加了乙個結構體大小的位元組,所以第乙個列印的為100020

而對於剩下的兩個,第乙個(unsigned long)p把p強轉為long型別的,而此時+0x1就相當於加乙個整數1,故輸出為100001。而(unsigned int*)p把p強轉換為無符號int 型的乙個指標。此時+0x1相當於加了乙個int型指標的大小,我們知道在32為機器下無論什麼指標都是4位元組,所以結果應該為100004。

問題三

int a[4]

=;int*ptr1 =

(int*)

(&a +1)

;int

*ptr2 =

(int*)

((int)a +1)

;printf

("%x,%x"

, ptr1[-1

],*ptr2)

;

這個問題與第一題有點像。

首先&a取的為這個陣列指標,再+1後指向4後面的元素位址。要注意,此時還是乙個陣列指標,而經過(int * )後此時ptr1為乙個int 型的指標而列印的ptr1[-1]即位址-1,指向4這個元素的位址。而%x列印乙個16進製制整數,故列印結果為4。

而對於第二個取得a為1這個元素的位址的首位元組。將這個位址強轉為int型再加1後,就為乙個整數。而得到的答案又被強轉為int型的乙個指標,故 *ptr2表示是從當前位址開始往後讀取四個位元組並且當成int來理解,而又因為大多數機器為小端位元組序,故答案為2000000。

問題四

int a[3]

[2]=

;int

*p; p = a[0]

;printf

("%d"

, p[0]

);

這個題是一道很經典的題型,首先看這個二維陣列,這是乙個長度為3的一維陣列,其中每個元素為長度為2的一維陣列。不過你有沒有發現什麼不對,沒錯,裡面用到的是小括號,並且用逗號運算子隔開,我們知道逗號運算子所取得的是最後乙個逗號右邊的數。故這個二維陣列表示為, , },我們來看,p=a[0]得到的是乙個長度為二的一維陣列的,此時p[0]則是取這個一維陣列的首元素,故與a[0][0]所表達的意思一樣。即答案為1。

問題五

int a[5]

[5];

// 二維陣列

int(

*p)[4]

;// 陣列指標

p = a;

printf

("%p,%d\n"

,&p[4]

[2]-

&a[4][

2],&p[4]

[2]-

&a[4][

2]);

首先建立了乙個二維陣列,又建立了乙個陣列指標。不過這個陣列指標指向的是長度為4的陣列。而p=a這一句。使得p每次取四個元素,這樣一直存下取,而該陣列是以五個元素為一組一共五組。故所需要列印的分別是乙個指標和乙個整數,值得注意的是兩個指標相減是要求這兩個指標在同乙個記憶體上,所得到的差值用%d列印則是這兩個位址之間的元素個數。由於在不同機器上列印結果不同故答案不在此展示。

問題六

int aa[2]

[5]=

,};int

*ptr1 =

(int*)

(&aa +1)

;int

*ptr2 =

(int*)

(*(aa +1)

);printf

("%d,%d",*

(ptr1 -1)

,*(ptr2 -1)

);

這道題與第一道也有類似的地方,&aa取的是這個二維陣列的位址,故+1後指向這個二維陣列的下乙個位址,所以ptr1得到的是強轉為int 型的指標。而aa+1中aa被隱式轉換為乙個長度為5的乙個陣列指標,即指向這個陣列,此時再+1得到的是則指向這個陣列。同樣ptr2也被強轉換為int型的乙個指標。而指標-1後則指向前乙個元素的位址。故列印結果為10,5。

問題七

char

*a=;

char

**pa = a;

pa++

;printf

("%s\n"

,*pa)

;

首先我們要知道a是個指標陣列。而pa乙個二級指標,指向a的首位址。我們知道a[0]指向 「work」,a[1]指向"at",a[2]指向"alibaba"。而pa指向a[0]這個位址,故pa++後指向"at」這個元素的位址,故%s列印後結果為 at。

問題八

char

*c=;

char

**cp=

;char**

*cpp = cp;

printf

("%s\n",*

*++cpp)

;printf

("%s\n",*

--*++cpp +3)

;printf

("%s\n"

,*cpp[-2

]+3)

;

這道題給出的條件與上道題類似,首先我們知道a[0]指向"enter"的位址,a[1]指向"new"的位址,a[2]指向"point"的位址,a[3]指向"first"的位址。而cp為乙個二級指標,不難看出cp[0]指向c[3]的位址,cp[1]指向c[2]的位址,cp[2]指向c[1]的位址,cp[3]指向c[0]的位址。而cpp為乙個**指標,此時將cp賦給它,則它指向cp的首元素位址。分析過後,我們來看需要列印的結果。

首先通過運算優先順序我們知道,先++cpp得到cp[1]的位址,解引用得到c[2]的位址,再解引用列印出"point"。

第二個同樣++cpp得到cp[2]的位址,解引用得到c[1]的位址再減減後得到c[0]的位址,此時指向"enter",而+3後則指向第二個字母e的位址,故5s列印得到"er"。

第三個cpp[-2]即cpp-2指標減2後指向cp[0]的位址,解引用得到cp[0]即c[3]的位址,此時指向"first"首字母位址,+3後指向s,故%s列印得到"s"。

面試經典題

include include char strcpy char strdest,const char strsrc 將源字串加const表明為輸入引數 bool 型別 if var int 型別 if var 0 float型別 const float epsinon 0.00001 if x e...

C語言面試經典tips

1 迴圈執行了多少次?include int main return 0 question 迴圈執行了多少次?答 char的範圍是 128,127 i 128 條件一不滿足,死迴圈。2 下列返回值輸出 int func void return sum 答 unsigned char 的範圍是 0 1...

c語言100道經典題目 C語言經典100題(5)

1 上期答案揭曉 include int main sum sum day 再加上某天的天數 if year 400 0 year 4 0 year 100 0 else if leap 1 month 2 printf 這是這一年的第 d 天。sum printf n 以上例項輸出結果為 請輸入年...