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Ⅱ碼值存儲的,可以通過字符變量直接獲取其ASCⅡ碼值。
首先,我們已知:
字符‘A’的ASCⅡ碼值是65。
字符‘D’的ASCⅡ碼值是68(因為‘D’在‘A’之后3個位置,所以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
計算的是字符‘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?錯誤
解析:
這是一道關(guān)于C語言中指針和字符串的題目。我們需要判斷給定的語句char *p="girl";
是否正確地描述了指針變量p
的定義和它的值。
首先,分析語句char *p="girl";
:
char *p
定義了一個字符型指針變量p
。
"girl"
是一個字符串常量,它在內(nèi)存中的某個位置有一個首地址。
p
被初始化為指向字符串常量"girl"
的首地址。
接下來,判斷題目的描述:
“定義字符型指針變量p”是正確的,因為char *p
確實定義了一個字符型指針。
“p的值是字符串"girl"”這一描述需要澄清。實際上,p
的值不是字符串"girl"
本身,而是該字符串在內(nèi)存中的首地址。字符串本身是由多個字符組成的字符數(shù)組,并以空字符結(jié)尾。指針
p
指向這個數(shù)組的首元素(即字符'g'
的地址)。
因此,題目的描述是不準確的。指針p
存儲的是字符串"girl"
的首地址,而不是字符串本身。
所以,正確答案是B)錯誤。
3.在x86系統(tǒng)下,sizeof如下結(jié)構(gòu)體的值是多少?
struct{
char a[10];
int b;
short c[3];
}
解析:
在x86系統(tǒng)下(即32位系統(tǒng)),sizeof
運算符用于計算結(jié)構(gòu)體所占的內(nèi)存大小。計算時需要考慮結(jié)構(gòu)體的成員類型、數(shù)量以及內(nèi)存對齊(alignment)的要求。
給定的結(jié)構(gòu)體如下:
復(fù)制代碼
struct { | |
char a[10]; | |
int b; | |
short c[3]; | |
}; |
我們逐一分析每個成員的大小和對齊要求:
char a[10];
:這是一個字符數(shù)組,包含10個字符。每個字符的大小是1字節(jié),所以整個數(shù)組的大小是10字節(jié)。
int b;
:在x86系統(tǒng)下,int
類型通常占用4字節(jié),并且它通常要求按4字節(jié)對齊。
short c[3];
:這是一個短整型數(shù)組,包含3個short
類型的元素。在x86系統(tǒng)下,short
類型通常占用2字節(jié)。數(shù)組的總大小是6字節(jié),但每個short
可能也要求按2字節(jié)或4字節(jié)對齊(具體取決于編譯器的對齊策略)。
現(xiàn)在,我們根據(jù)這些信息進行計算,同時考慮內(nèi)存對齊:
char a[10];
占用10字節(jié),不需要對齊調(diào)整。
接下來是int b;
,它要求4字節(jié)對齊。由于char a[10];
已經(jīng)占用了10字節(jié),而下一個4字節(jié)對齊的位置是12字節(jié)(因為10不是4的倍數(shù)),所以在這里會有2字節(jié)的填充(padding)。
int b;
占用4字節(jié)。
最后是short c[3];
,每個short
占用2字節(jié),總共6字節(jié)。但是,由于int b;
之后的位置已經(jīng)是4字節(jié)對齊的,并且short
數(shù)組通常要求按2字節(jié)或4字節(jié)對齊(具體取決于編譯器),所以在這里可能不需要額外的填充。然而,為了簡化計算,我們假設(shè)編譯器選擇4字節(jié)對齊,并且short c[3];
之后也需要4字節(jié)對齊(這是最常見的情況)。那么,在int b;
(4字節(jié))和short c[3];
(6字節(jié))之間會有2字節(jié)的填充,使得short c[3];
從4字節(jié)對齊的位置開始。
short c[3];
本身占用6字節(jié),不需要額外的填充來達到4字節(jié)對齊,因為它之后沒有其他成員了。
綜上所述,結(jié)構(gòu)體的內(nèi)存布局可能如下(考慮4字節(jié)對齊):復(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
這個結(jié)構(gòu)體的值是24字節(jié)。
4.運行以下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"};
?定義了一個包含三個字符指針的數(shù)組,每個指針分別指向字符串 "stra"、"strb" 和 "strc" 的首字符。
char *p = str[0];
?初始化指針?p
,使其指向?str
?數(shù)組的第一個元素,即字符串 "stra" 的首字符。
進入?while
?循環(huán),循環(huán)條件是?i < 3
,意味著循環(huán)體會執(zhí)行三次。
在循環(huán)體內(nèi):
printf("%s ", p++);
?打印?p
?當前指向的字符串,并將?p
?遞增,使其指向下一個字符。
i++;
?遞增循環(huán)計數(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++
?會使?p
?指向 "stra" 的 'a',但此時循環(huán)已經(jīng)結(jié)束。
i
?變?yōu)?3,循環(huán)條件不再滿足。
因此,程序的輸出是:復(fù)制代碼
stra tra ra |
所以,運行這段代碼的結(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語言代碼中,我們定義了一個二維字符數(shù)組str
和一個字符指針數(shù)組strp
,并通過循環(huán)將str
中每一行的首地址賦值給strp
中對應(yīng)的元素。接下來,我們詳細解讀這段代碼。
首先,看定義部分:
復(fù)制代碼
char str[4][12] = {"aaa", "bbbb", "ccccc", "dddddd"}; | |
char *strp[4]; |
char str[4][12]
定義了一個包含4行、每行12列的二維字符數(shù)組,并初始化了前四行。需要注意的是,雖然為每行分配了12個字符的空間,但實際存儲的字符串長度并未達到12,剩余空間將自動填充為空字符。
char *strp[4]
則定義了一個包含4個字符指針的數(shù)組,這些指針將用于指向字符串。
接下來,通過循環(huán)為strp
數(shù)組賦值:
復(fù)制代碼
for (int i = 0; i < 4; i++) | |
strp[i] = str[i]; |
在這個循環(huán)中,i
從0遍歷到3。
對于每個i
,str[i]
表示str
數(shù)組中的第i
行,也就是一個指向該行首字符的指針。
我們將這個指針賦值給strp[i]
,因此strp[i]
現(xiàn)在指向了str
數(shù)組中的第i
行字符串。
循環(huán)結(jié)束后,strp
數(shù)組中的每個元素都指向了str
數(shù)組中的一行字符串。具體來說:
strp[0]
指向"aaa"
strp[1]
指向"bbbb"
strp[2]
指向"ccccc"
strp[3]
指向"dddddd"
此時,我們可以利用strp
數(shù)組中的指針來訪問或操作str
數(shù)組中的字符串。例如,printf("%sn", strp[0]);
將會輸出"aaa"
。
未完待續(xù),持續(xù)更新!以防后邊找不到可以點贊收藏下!