1.已知字符‘A‘的ASCⅡ码值是是65,且char c1=‘A’,c2=‘D’;则执行语句printf(“%d, %dn”, c1, c2-2); 后的输出结果是( )
A A,DB A,BC 65,68D 65,66
解析:
在C语言中,字符常量在内存中是以其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。
然后,执行printf("%d, %dn", c1, c2-2);这条语句:
%d是整数格式说明符,用于输出整数。
c1直接输出,其值为字符‘A’的ASCⅡ码值,即65。
c2-2计算的是字符‘D’的ASCⅡ码值减去2,即68-2=66。66正好是字符‘B’的ASCⅡ码值,但这里以整数形式输出。
因此,输出结果是65, 66。
所以,正确答案是D)65,66。
2.char *p="girl" ;的含义是定义字符型指针变量p,p的值是字符串"girl"。()
A 正确
B 错误
解析:
这是一道关于C语言中指针和字符串的题目。我们需要判断给定的语句char *p="girl";是否正确地描述了指针变量p的定义和它的值。
首先,分析语句char *p="girl";:
char *p定义了一个字符型指针变量p。
"girl"是一个字符串常量,它在内存中的某个位置有一个首地址。
p被初始化为指向字符串常量"girl"的首地址。
接下来,判断题目的描述:
“定义字符型指针变量p”是正确的,因为char *p确实定义了一个字符型指针。
“p的值是字符串"girl"”这一描述需要澄清。实际上,p的值不是字符串"girl"本身,而是该字符串在内存中的首地址。字符串本身是由多个字符组成的字符数组,并以空字符结尾。指针p指向这个数组的首元素(即字符'g'的地址)。
因此,题目的描述是不准确的。指针p存储的是字符串"girl"的首地址,而不是字符串本身。
所以,正确答案是B)错误。
3.在x86系统下,sizeof如下结构体的值是多少?
struct{char a[10];int b;short c[3];}
解析:
在x86系统下(即32位系统),sizeof运算符用于计算结构体所占的内存大小。计算时需要考虑结构体的成员类型、数量以及内存对齐(alignment)的要求。
给定的结构体如下:
复制代码
| struct { | |
| char a[10]; | |
| int b; | |
| short c[3]; | |
| }; |
我们逐一分析每个成员的大小和对齐要求:
char a[10];:这是一个字符数组,包含10个字符。每个字符的大小是1字节,所以整个数组的大小是10字节。
int b;:在x86系统下,int类型通常占用4字节,并且它通常要求按4字节对齐。
short c[3];:这是一个短整型数组,包含3个short类型的元素。在x86系统下,short类型通常占用2字节。数组的总大小是6字节,但每个short可能也要求按2字节或4字节对齐(具体取决于编译器的对齐策略)。
现在,我们根据这些信息进行计算,同时考虑内存对齐:
char a[10];占用10字节,不需要对齐调整。
接下来是int b;,它要求4字节对齐。由于char a[10];已经占用了10字节,而下一个4字节对齐的位置是12字节(因为10不是4的倍数),所以在这里会有2字节的填充(padding)。
int b;占用4字节。
最后是short c[3];,每个short占用2字节,总共6字节。但是,由于int b;之后的位置已经是4字节对齐的,并且short数组通常要求按2字节或4字节对齐(具体取决于编译器),所以在这里可能不需要额外的填充。然而,为了简化计算,我们假设编译器选择4字节对齐,并且short c[3];之后也需要4字节对齐(这是最常见的情况)。那么,在int b;(4字节)和short c[3];(6字节)之间会有2字节的填充,使得short c[3];从4字节对齐的位置开始。
short c[3];本身占用6字节,不需要额外的填充来达到4字节对齐,因为它之后没有其他成员了。
综上所述,结构体的内存布局可能如下(考虑4字节对齐):复制代码
| | 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 | |
因此,结构体的总大小是:10 + 2 + 4 + 2 + 6 = 24字节。
所以,在x86系统下,sizeof这个结构体的值是24字节。
4.运行以下C语言代码,输出的结果是()
#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"}; 定义了一个包含三个字符指针的数组,每个指针分别指向字符串 "stra"、"strb" 和 "strc" 的首字符。
char *p = str[0]; 初始化指针 p,使其指向 str 数组的第一个元素,即字符串 "stra" 的首字符。
进入 while 循环,循环条件是 i < 3,意味着循环体会执行三次。
在循环体内:
printf("%s ", p++); 打印 p 当前指向的字符串,并将 p 递增,使其指向下一个字符。
i++; 递增循环计数器 i。
现在,我们逐步跟踪循环的执行:
第一次循环:
p 指向 "stra" 的 's'。
打印 "stra "。
p++ 使 p 指向 "stra" 的 't'。
i 变为 1。
第二次循环:
p 现在指向 "stra" 的 't'。
打印 "tra "(注意,p 已经跳过了 's')。
p++ 使 p 指向 "stra" 的 'r'。
i 变为 2。
第三次循环:
p 现在指向 "stra" 的 'r'。
打印 "ra "(注意,p 已经跳过了 's' 和 't')。
p++ 会使 p 指向 "stra" 的 'a',但此时循环已经结束。
i 变为 3,循环条件不再满足。
因此,程序的输出是:复制代码
| stra tra ra |
所以,运行这段代码的结果是输出字符串 "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语言代码中,我们定义了一个二维字符数组str和一个字符指针数组strp,并通过循环将str中每一行的首地址赋值给strp中对应的元素。接下来,我们详细解读这段代码。
首先,看定义部分:
复制代码
| char str[4][12] = {"aaa", "bbbb", "ccccc", "dddddd"}; | |
| char *strp[4]; |
char str[4][12]定义了一个包含4行、每行12列的二维字符数组,并初始化了前四行。需要注意的是,虽然为每行分配了12个字符的空间,但实际存储的字符串长度并未达到12,剩余空间将自动填充为空字符。
char *strp[4]则定义了一个包含4个字符指针的数组,这些指针将用于指向字符串。
接下来,通过循环为strp数组赋值:
复制代码
| for (int i = 0; i < 4; i++) | |
| strp[i] = str[i]; |
在这个循环中,i从0遍历到3。
对于每个i,str[i]表示str数组中的第i行,也就是一个指向该行首字符的指针。
我们将这个指针赋值给strp[i],因此strp[i]现在指向了str数组中的第i行字符串。
循环结束后,strp数组中的每个元素都指向了str数组中的一行字符串。具体来说:
strp[0]指向"aaa"
strp[1]指向"bbbb"
strp[2]指向"ccccc"
strp[3]指向"dddddd"
此时,我们可以利用strp数组中的指针来访问或操作str数组中的字符串。例如,printf("%sn", strp[0]);将会输出"aaa"。
未完待续,持续更新!以防后边找不到可以点赞收藏下!
936