1.
main();
int *ptr = (int*)(&a+1);
printf("%d %d" , *(a+1), *(ptr-1) );
這段程式的輸出是:
(a) 2 2
(b) 2 1
(c) 2 5
(d) 以上均不是
2.考查自加操作(++)
main()
這段程式的輸出是:
(a) i=4 j=2
(b) i=3 j=2
(c) i=3 j=4
(d) i=3 j=6
3.此題考查的是c的變長引數
#include
int ripple ( int , ...);
main()
int ripple (int n, ...)
這段程式的輸出是:
(a) 7
(b) 6
(c) 5
(d) 3
1.(c)
a的型別是乙個整型陣列,它有5個成員
&a是指向陣列的指標
ptr指標,即&a+1實際指向a[6]。ptr-1之後,指向a[5]。
2.(b)
sizeof 操作符給出其運算元需要占用的空間大小,它是在編譯時就可確定的,所以其運算元即使是乙個表示式,也不需要在執行時進行計算.( ++i + ++ i )是不會執行的,所以
i 的值還是3
3. (c)
在c編譯器通常提供了一系列處理可變引數的巨集,以遮蔽不同的硬體平台造成的差異,增加程式的可移植性。這些巨集包括va_start、 va_arg和va_end等。
採用ansi標準形式時,引數個數可變的函式的原型宣告是:
type funcname(type para1, type para2, ...)
這種形式至少需要乙個普通的形式引數,後面的省略號不表示省略,而是函式原型的一部分。type是函式返回值和形式引數的型別。
不同的編譯器,對這個可變長引數的實現不一樣 ,gcc4.x中是內建函式.
關於可變長引數,可參閱
程式分析
va_list p; /*定義乙個變數 ,儲存 函式引數列表 的指標*/
va_start( p , n); /*用va_start巨集 初始化 變數p, va_start巨集的第2個引數n , 是乙個固定的引數, 必須是我們自己定義的變長函式的最後乙個入棧的引數,也就是呼叫的時候引數列表 裡的第1個引數*/
for (; ji = va_arg( p , int); /*va_arg取出當前的引數, 並認為取出的引數是乙個整數(int) */
for (; i; i &=i-1 ) /*判斷取出的i是否為0*/
++k; /* 如果i不為0, k自加, i與i-1進行與邏輯運算, 直到i 為0,為了獲得i用二進位制表示時,其中二進位制1的總個數*/
當我們呼叫ripple函式時,傳遞給ripple函式的 引數列表的第乙個引數n的值是3 .
va_start 初始化 p,指向第乙個未命名的引數(n是有名字的引數) ,也就是 is 5 (第乙個).
每次對 va_arg的呼叫,都將返回乙個引數,並且把 p 指向下乙個引數.
va_arg 用乙個型別名來決定返回的引數是何種型別,以及在 var_arg的內部實現中決定移動多大的距離才到達下乙個 引數
(; i; i&=i-1) k++ /* 計算i有多少bit被置1 */
5用二進位制表示是 (101) 2
7用二進位制表示 (111) 3
所以 k 返回 5(2+3),也即本題應該選c
嵌入式面試題
15 typedef 在c語言中頻繁用以宣告乙個已經存在的資料型別的同義字。也可以用預處理器做類似的事。例如,思考一下下面的例子 define dps struct s typedef struct s tps 以上兩種情況的意圖都是要定義dps 和 tps 作為乙個指向結構s指標。哪種方法更好呢?...
嵌入式面試題
以下是我找嵌入式面試時遇到的一些問題,答案以後慢慢補充。1.incline和巨集定義的區別 3.linux自旋鎖 4.程序,執行緒的概念 5.strcpy的使用,具體實現 6.雙向鍊錶的插入,刪除 7.大端小端概念 8.寫一段c程式檢測cpu是32位還是64位 9.malloc和new的使用 10....
嵌入式面試題
如果是同步io,當乙個io操作執行時,應用程式必須等待,直到此io執行完,相反,非同步io操作在後台執行,io操作和應用程式可以同時執行,提高系統效能,提高io流量 在同步檔案io中,執行緒啟動乙個io操作然後就立即進入等待狀態,直到io操作完成後才醒來繼續執行,而非同步檔案io中,執行緒傳送乙個i...