嵌入式筆試面試題 c語(yǔ)言相關(guān)
(1)一個(gè)整型數(shù): int a。
(2)一個(gè)指向整型數(shù)的指針(一重指針): int *a。
(3)一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)的指針(二重指針): int **a。
(4)一個(gè)有10個(gè)整型數(shù)的數(shù)組 :int a[10]。
(5)一個(gè)有10個(gè)指針的數(shù)組,這10個(gè)指針是指向整型數(shù)的(指針數(shù)組): int *a[10]。
(6)一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針(數(shù)組指針):int (*a)[10]。
(7)一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(函數(shù)指針):int (*a)(int)。
(8)一個(gè)有10個(gè)指針的數(shù)組,這10個(gè)指針均指向函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回一 個(gè)整型數(shù)(函數(shù)指針數(shù)組): int (*a[10])(int)。
2.2 下面的代碼輸出是什么,為什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a + b > 6)? printf("> 6") : printf(" <= 6");
}
答案:輸出是 ">6"。
解讀:當(dāng)運(yùn)算表達(dá)式中存在有符號(hào)數(shù)和無(wú)符號(hào)數(shù)時(shí),有符號(hào)數(shù)隱式轉(zhuǎn)換成了無(wú)符號(hào)數(shù)(即底層的補(bǔ)碼不變,但是此數(shù)從有符號(hào)數(shù)變成了無(wú)符號(hào)數(shù))。注意,正數(shù)的補(bǔ)碼為其本身,負(fù)數(shù)的補(bǔ)碼為其反碼+1。因此-20變成了一個(gè)非常大的正整數(shù),所以該表達(dá)式計(jì)算出的結(jié)果 ">6"。
if(x >= -0.000001 && x <= 0.000001)
解讀:因?yàn)橛?jì)算機(jī)在處理浮點(diǎn)數(shù)的時(shí)候是有誤差的,所以不能將浮點(diǎn)型變量用"=="或"!="與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化成">="或"<="此類形式。
2.4 下面代碼有什么錯(cuò)誤?
#include
void main()
{
char *s = "AAA";
s[0] = 'B';
printf("%s", s);
}
2.5 下面代碼輸出是什么?
#include
void main()
{
int *a = (int *)2;
printf("%d", a + 3);
}
答案:輸出是14。
解讀:代碼將數(shù)值2強(qiáng)制類型轉(zhuǎn)換為int類型指針,int類型指針加3 相當(dāng)于指向后面第三個(gè)int類型變量的首地址,一個(gè)int類型變量占4個(gè)字節(jié),所以加3相當(dāng)于指針往后移了12個(gè)字節(jié),指向地址14處。