看看大疆的C語言面試題

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

慣例,這筆試題也是一個讀者朋友發給個人,簡單看了下,並不以爲這是一個很是困難的題目,最近是校招準備的時候,不少人給我說發麪試題對你們有幫助。面試

這個題目面試官強調了這個跑在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字節的,當你講到這裏,面試官不知道有多喜歡你了。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

相關文章
相關標籤/搜索