慣例,這筆試題也是一個讀者朋友發給個人,簡單看了下,並不以爲這是一個很是困難的題目,最近是校招準備的時候,不少人給我說發麪試題對你們有幫助。面試
這個題目面試官強調了這個跑在64位系統下。ide
代碼以下:指針
#define mal(x,y) (x*y) int main() { int i = 3; int a; char **b[5][6]; a = mal(i++, sizeof(b) + 5); printf("%d", a); return 0; }怎麼肯定指針大小?
咱們有必要討論下這個問題,指針的大小,既然要討論指針的大小,就要說下,指針是什麼東西,看我以前文章的人應該都知道,指針就是地址,地址那就和機器的地址線「有不一樣意見能夠留言」有關係。code
若是是16位機器,咱們須要保存一個地址就須要2個字節,因此一個指針的大小就是2bytes. 若是是32位機器,咱們須要保存一個地址就須要4個字節,因此一個指針的大小就是4bytes. 若是是64位機器,咱們須要保存一個地址就須要8個字節,因此一個指針的大小就是8bytes.blog
而後咱們再討論下,咱們平時說的32位機,64位機,咱們指的是它的地址線個數仍是數據線個數呢?it
提醒下io
咱們平時在64位機上的指針大小也是4個字節,主要是爲了兼容32位的機器,若是真的想讓指針在64位系統機器佔用8個字節,須要作某些設置。class
因此你以爲上面的程序輸出啥?咱們能夠先看看這個代碼輸出了啥程序
#include "stdio.h" int main() { int i = 3; printf("%d\n",i++*3+1); return 0; }
這個涉及考察 「++i」和「i++」在執行順序。im
輸出:
10 -------------------------------- Process exited after 0.08891 seconds with return value 0 請按任意鍵繼續. . .
咱們展開上面的代碼
a = mal(i++, sizeof(b) + 5);
展開
a = i++*sizeof(b)+5;
由於咱們在32系統裏面,sizeof(char**) = 4
i++*sizeof(b)+5
3 * 4 * 5 * 6 + 5
輸出:
365 -------------------------------- Process exited after 0.1062 seconds with return value 0 請按任意鍵繼續. . .面試的時候怎麼說?
若是面試的時候,你能把這個過程說出來給面試官說清楚,而且能講提到雖然是64位系統,可是由於須要兼容32位程序,指針的大小仍是 4字節的,當你講到這裏,面試官不知道有多喜歡你了。