問題一
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 以上例項輸出結果為 請輸入年...