優視科技一道指標筆試題目

才智咖 人氣:2.32W

今天晚上參加優視(UC)的筆試,我報了一個c++的軟體開發工程師,考前我就想這次一定會考指標題目,所以事先就看了很多關於指標的內容,果然,還是出了一道指標,並且包含有結構體struct,題目是這樣的,前提是在一臺i386的機子上執行

優視科技一道指標筆試題目

#include

struct a

{

int b;

short*pd;

char str[32];

};

a st[16];

int _tmain(int argc, _TCHAR* argv[])

{

char * p= (char*)(st[2]+32);

cout<

return 0;

}

問你輸出結果是什麼?

哇!!!!,看到這裡是不是感覺到有點頭大呢!雖然考前看了很多指標的東西,但是到這裡卻還是頭大,好了,接下來我就認真分析一下這道題目:

1> 看準前提條件,這是一臺I386的機子,這個條件很用,它說明了我們執行平臺是一個32位機,因此int型別佔用4個位元組32位。

2> 接下來我們分析一下struct型別,前面一個int b, 佔用4個位元組,中間一個short型別佔用兩個位元組,後面一個char型別的陣列,當然是佔用32個位元組,到這裡你認為分析完了嗎,很不幸,如果你只分析到這一步,肯定得不到正確結果,現在讓我們來想一想struct型別在編譯之後資料存放地址的對齊問題,這涉及到一個原則就是sizeof(struct_name)一定是結構體中最長型別的'整數倍,即sizeof(a)%4==0,這樣計算則可知sizeof(a)==40,這種對齊方式是為了計算機計算時的方便,是編譯器效能優化的一部分,具體細節你可以去google一下,上面的計算方式很簡單,但是並不通用。

3>經過第二步的分析我們知道a的大小為40個位元組,接下來我們分析st[2]+32,這裡str[2]取出來的是一個地址,故st[2]的偏移量(相對於str[0])為80,而str[2]相對str[2]偏移了8個位元組,故str[2]的相對偏移量為88,加上32之後變為偏移量為120.、

4>由3的分析知指標p現在指向的地址相對偏移量為120,故p-((char*)(st)) 為120,這是由於(char*)st指向 陣列開始地址,由於初始化的st為空,幫指標指向內容為空,故p-((char*)(st))=120.