• 正文
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

嵌入式C語言面試題1

2024/12/02
1765
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

1.已知字符‘A‘的ASCⅡ碼值是是65,且char c1=‘A’,c2=‘D’;則執(zhí)行語句printf(“%d, %dn”, c1, c2-2); 后的輸出結(jié)果是(?)

A?A,DB?A,BC?65,68D?65,66

解析:

在C語言中,字符常量在內(nèi)存中是以其ASCⅡ碼值存儲(chǔ)的,可以通過字符變量直接獲取其ASCⅡ碼值。

首先,我們已知:

字符‘A’的ASCⅡ碼值是65。

字符‘D’的ASCⅡ碼值是68(因?yàn)椤瓺’在‘A’之后3個(gè)位置,所以65+3=68)。

接下來,分析題目中的代碼:

char c1 = 'A';?這行代碼定義了字符變量c1,并將其初始化為字符‘A’,所以c1的ASCⅡ碼值是65。

char c2 = 'D';?這行代碼定義了字符變量c2,并將其初始化為字符‘D’,所以c2的ASCⅡ碼值是68。

然后,執(zhí)行printf("%d, %dn", c1, c2-2);這條語句:

%d是整數(shù)格式說明符,用于輸出整數(shù)。

c1直接輸出,其值為字符‘A’的ASCⅡ碼值,即65。

c2-2計(jì)算的是字符‘D’的ASCⅡ碼值減去2,即68-2=66。66正好是字符‘B’的ASCⅡ碼值,但這里以整數(shù)形式輸出。

因此,輸出結(jié)果是65, 66。

所以,正確答案是D)65,66。

2.char *p="girl"?;的含義是定義字符型指針變量p,p的值是字符串"girl"。()

A?正確

B?錯(cuò)誤

解析:

這是一道關(guān)于C語言中指針和字符串的題目。我們需要判斷給定的語句char *p="girl";是否正確地描述了指針變量p的定義和它的值。

首先,分析語句char *p="girl";

char *p定義了一個(gè)字符型指針變量p。

"girl"是一個(gè)字符串常量,它在內(nèi)存中的某個(gè)位置有一個(gè)首地址。

p被初始化為指向字符串常量"girl"的首地址。

接下來,判斷題目的描述:

“定義字符型指針變量p”是正確的,因?yàn)?code>char *p確實(shí)定義了一個(gè)字符型指針。

“p的值是字符串"girl"”這一描述需要澄清。實(shí)際上,p的值不是字符串"girl"本身,而是該字符串在內(nèi)存中的首地址。字符串本身是由多個(gè)字符組成的字符數(shù)組,并以空字符結(jié)尾。指針p指向這個(gè)數(shù)組的首元素(即字符'g'的地址)。

因此,題目的描述是不準(zhǔn)確的。指針p存儲(chǔ)的是字符串"girl"的首地址,而不是字符串本身。

所以,正確答案是B)錯(cuò)誤。

3.在x86系統(tǒng)下,sizeof如下結(jié)構(gòu)體的值是多少?

struct{    char a[10];    int b;    short c[3];}

解析:

在x86系統(tǒng)下(即32位系統(tǒng)),sizeof運(yùn)算符用于計(jì)算結(jié)構(gòu)體所占的內(nèi)存大小。計(jì)算時(shí)需要考慮結(jié)構(gòu)體的成員類型、數(shù)量以及內(nèi)存對(duì)齊(alignment)的要求。

給定的結(jié)構(gòu)體如下:

復(fù)制代碼

struct {
char a[10];
int b;
short c[3];
};

我們逐一分析每個(gè)成員的大小和對(duì)齊要求:

char a[10];:這是一個(gè)字符數(shù)組,包含10個(gè)字符。每個(gè)字符的大小是1字節(jié),所以整個(gè)數(shù)組的大小是10字節(jié)。

int b;:在x86系統(tǒng)下,int類型通常占用4字節(jié),并且它通常要求按4字節(jié)對(duì)齊。

short c[3];:這是一個(gè)短整型數(shù)組,包含3個(gè)short類型的元素。在x86系統(tǒng)下,short類型通常占用2字節(jié)。數(shù)組的總大小是6字節(jié),但每個(gè)short可能也要求按2字節(jié)或4字節(jié)對(duì)齊(具體取決于編譯器的對(duì)齊策略)。

現(xiàn)在,我們根據(jù)這些信息進(jìn)行計(jì)算,同時(shí)考慮內(nèi)存對(duì)齊:

char a[10];占用10字節(jié),不需要對(duì)齊調(diào)整。

接下來是int b;,它要求4字節(jié)對(duì)齊。由于char a[10];已經(jīng)占用了10字節(jié),而下一個(gè)4字節(jié)對(duì)齊的位置是12字節(jié)(因?yàn)?0不是4的倍數(shù)),所以在這里會(huì)有2字節(jié)的填充(padding)。

int b;占用4字節(jié)。

最后是short c[3];,每個(gè)short占用2字節(jié),總共6字節(jié)。但是,由于int b;之后的位置已經(jīng)是4字節(jié)對(duì)齊的,并且short數(shù)組通常要求按2字節(jié)或4字節(jié)對(duì)齊(具體取決于編譯器),所以在這里可能不需要額外的填充。然而,為了簡化計(jì)算,我們假設(shè)編譯器選擇4字節(jié)對(duì)齊,并且short c[3];之后也需要4字節(jié)對(duì)齊(這是最常見的情況)。那么,在int b;(4字節(jié))和short c[3];(6字節(jié))之間會(huì)有2字節(jié)的填充,使得short c[3];從4字節(jié)對(duì)齊的位置開始。

short c[3];本身占用6字節(jié),不需要額外的填充來達(dá)到4字節(jié)對(duì)齊,因?yàn)樗鬀]有其他成員了。

綜上所述,結(jié)構(gòu)體的內(nèi)存布局可能如下(考慮4字節(jié)對(duì)齊):復(fù)制代碼

| char a[10] | padding (2 bytes) | int b (4 bytes) | padding (2 bytes) | short c[3] (6 bytes) |
|-------------|-------------------|-----------------|-------------------|--------------------|
| 10 bytes | 2 bytes | 4 bytes | 2 bytes | 6 bytes |

 

因此,結(jié)構(gòu)體的總大小是:10 + 2 + 4 + 2 + 6 = 24字節(jié)。

所以,在x86系統(tǒng)下,sizeof這個(gè)結(jié)構(gòu)體的值是24字節(jié)。

4.運(yùn)行以下C語言代碼,輸出的結(jié)果是()

#include <stdio.h>
int main(){    char *str[3] ={"stra", "strb", "strc"};    char *p =str[0];    int i = 0;????while(i?<?3) {        printf("%s ",p++);????????i++;????}    return 0;}

A?stra strb strc

B?s t r

C?stra tra ra

D?s s s

解析:

char *str[3] = {"stra", "strb", "strc"};?定義了一個(gè)包含三個(gè)字符指針的數(shù)組,每個(gè)指針分別指向字符串 "stra"、"strb" 和 "strc" 的首字符。

char *p = str[0];?初始化指針?p,使其指向?str?數(shù)組的第一個(gè)元素,即字符串 "stra" 的首字符。

進(jìn)入?while?循環(huán),循環(huán)條件是?i < 3,意味著循環(huán)體會(huì)執(zhí)行三次。

在循環(huán)體內(nèi):

printf("%s ", p++);?打印?p?當(dāng)前指向的字符串,并將?p?遞增,使其指向下一個(gè)字符。

i++;?遞增循環(huán)計(jì)數(shù)器?i。

現(xiàn)在,我們逐步跟蹤循環(huán)的執(zhí)行:

第一次循環(huán):

p?指向 "stra" 的 's'。

打印 "stra "。

p++?使?p?指向 "stra" 的 't'。

i?變?yōu)?1。

第二次循環(huán):

p?現(xiàn)在指向 "stra" 的 't'。

打印 "tra "(注意,p?已經(jīng)跳過了 's')。

p++?使?p?指向 "stra" 的 'r'。

i?變?yōu)?2。

第三次循環(huán):

p?現(xiàn)在指向 "stra" 的 'r'。

打印 "ra "(注意,p?已經(jīng)跳過了 's' 和 't')。

p++?會(huì)使?p?指向 "stra" 的 'a',但此時(shí)循環(huán)已經(jīng)結(jié)束。

i?變?yōu)?3,循環(huán)條件不再滿足。

因此,程序的輸出是:復(fù)制代碼

stra tra ra

所以,運(yùn)行這段代碼的結(jié)果是輸出字符串 "stra tra ra "。

5.有以下語句:printf("%sn", strp[0]);輸出值是多少?

char str[4][12] = {"aaa", "bbbb", "ccccc", "dddddd"}, *strp[4];for (int i = 0; i < 4; i++)    strp[i] = str[i];

解析:

在這段C語言代碼中,我們定義了一個(gè)二維字符數(shù)組str和一個(gè)字符指針數(shù)組strp,并通過循環(huán)將str中每一行的首地址賦值給strp中對(duì)應(yīng)的元素。接下來,我們?cè)敿?xì)解讀這段代碼。

首先,看定義部分:

復(fù)制代碼

char str[4][12] = {"aaa", "bbbb", "ccccc", "dddddd"};
char *strp[4];

char str[4][12]定義了一個(gè)包含4行、每行12列的二維字符數(shù)組,并初始化了前四行。需要注意的是,雖然為每行分配了12個(gè)字符的空間,但實(shí)際存儲(chǔ)的字符串長度并未達(dá)到12,剩余空間將自動(dòng)填充為空字符。

char *strp[4]則定義了一個(gè)包含4個(gè)字符指針的數(shù)組,這些指針將用于指向字符串。

接下來,通過循環(huán)為strp數(shù)組賦值:

復(fù)制代碼

for (int i = 0; i < 4; i++)
strp[i] = str[i];

在這個(gè)循環(huán)中,i從0遍歷到3。

對(duì)于每個(gè)i,str[i]表示str數(shù)組中的第i行,也就是一個(gè)指向該行首字符的指針。

我們將這個(gè)指針賦值給strp[i],因此strp[i]現(xiàn)在指向了str數(shù)組中的第i行字符串。

循環(huán)結(jié)束后,strp數(shù)組中的每個(gè)元素都指向了str數(shù)組中的一行字符串。具體來說:

strp[0]指向"aaa"

strp[1]指向"bbbb"

strp[2]指向"ccccc"

strp[3]指向"dddddd"

此時(shí),我們可以利用strp數(shù)組中的指針來訪問或操作str數(shù)組中的字符串。例如,printf("%sn", strp[0]);將會(huì)輸出"aaa"

未完待續(xù),持續(xù)更新!以防后邊找不到可以點(diǎn)贊收藏下!

相關(guān)推薦