数据类型与类型转换
ID: 9571
题目
对于某台计算机,以下说法正确的是
A int 型值与 short 型值长度总是不一样
B int 型值与 float 型值长度总是一样
C 指向 int 型的指针与指向 char 型的指针长度总是一样
D double 型值与 float 型值总是不一样
解析
- A:
int和short的长度在不同平台可能相同(如部分16位系统),"总是不一样"错误。 - B:
int可能是4字节,float也可能是4字节,但也存在不同平台差异,"总是一样"错误。 - C:同一平台下,所有指针的长度都相同(等于机器字长,如32位或64位),与指向的类型无关,正确。
- D:
double和float类型不同,但"值总是不一样"说法错误,如float 1.0和double 1.0值相同。
答案:C
知识点总结
同一平台下,指针的长度由机器字长决定,与指向的数据类型无关。
ID: 9496
题目
关于 32 位机器下 int, float, double 格式强制转换,错误的是?
A int 转到 float,数字不会溢出,但不会被舍入。
B double 转 float,可能溢出成为正无穷或负无穷。
C double 转 float,可能会被舍入。
D double 转 int,值将会向 0 舍入。
解析
- A:
int转float时,虽然不会溢出(float指数范围更大),但部分大整数无法被float精确表示,会被舍入,"不会被舍入"错误。 - B:
double转float时,若数值超出float范围,会变为无穷大,正确。 - C:
double转float时,精度损失会导致舍入,正确。 - D:
double转int时,向零截断,即向0舍入,正确。
答案:A
知识点总结
int 转 float 时,超出 float 尾数精度的整数会被舍入;double 转 float 可能溢出或舍入;double 转 int 向零舍入。
ID: 9502
题目
下列说法正确的是
A 在 C 语言中一个有符号数和一个无符号数相加得到的结果一定是一个无符号数
B 在 C 语言中一个有符号数和一个无符号数相加得到的结果可能是一个有符号数
C 在 C 语言中一个有符号数和一个无符号数相减得到的结果一定是一个有符号数
D 在 C 语言中一个有符号数和一个无符号数相减得到的结果可能是一个有符号数
解析
- 在C语言中,有符号数与无符号数运算时,有符号数会被隐式转换为无符号数,结果为无符号数。因此A正确,B、C、D错误。
答案:A
知识点总结
C语言中,有符号数与无符号数运算时,有符号数会被隐式提升为无符号数,结果为无符号数。
ID: 9712
题目
有符号数与无符号数运算的结果为
A 有符号数
B 无符号数
C 0
D 不确定
解析
- 根据C语言的类型提升规则,有符号数与无符号数运算时,有符号数会被隐式转换为无符号数,结果为无符号数。
答案:B
知识点总结
C语言中,有符号数与无符号数运算的结果为无符号数。
ID: 9482
题目
当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么 C 语言会( )将( )参数强制类型转换为( )数,并假设这两个数都是非负的,来执行这个运算。
A 显式地 无符号 有符号
B 显示地 有符号 无符号
C 隐式地 无符号 有符号
D 隐式地 有符号 无符号
解析
- C语言会隐式地将有符号数转换为无符号数,再执行运算。因此选D。
答案:D
知识点总结
C语言中,有符号数与无符号数运算时,会隐式地将有符号数转换为无符号数。
ID: 9472
题目
32 位 linux 系统中,long 类型的字节数是
A 2
B 4
C 6
D 8
解析
- 32位Linux系统中,
long类型的长度为4字节;64位Linux中为8字节。
答案:B
知识点总结
32位系统中,long 类型占4字节;64位系统中占8字节。
ID: 9726
题目
下面 C 语言语句中数据类型及其典型的取值范围搭配正确的是()
A char [-128,127]
B unsigned char [0,128]
C short [-32768,32768]
D unsigned short [0,32767]
解析
- A:
char通常为有符号8位,范围[-128, 127],正确。 - B:
unsigned char范围应为[0, 255],错误。 - C:
short为16位有符号,范围[-32768, 32767],选项中最大值错误。 - D:
unsigned short范围应为[0, 65535],错误。
答案:A
知识点总结
char(有符号):[-128, 127]unsigned char:[0, 255]short:[-32768, 32767]unsigned short:[0, 65535]
指针、数组、结构体、联合体
ID: 9433
题目
double *D[5] 的元素大小和总大小分别为
A 8 40
B 8 5
C 4 20
D 4 5
解析
double *D[5]是指针数组,每个元素是指向double的指针。- 指针的大小由平台决定,64位平台下为8字节,32位平台下为4字节。
- 题目选项A(8 40)对应64位平台,元素大小8字节,总大小
5×8=40字节,为常规考点。
答案:A
知识点总结
指针数组的元素是指针,其大小等于平台指针宽度,总大小=元素个数×单个指针大小。
ID:9552
题目
32位机器中联合体定义:Union a{ int p[3]; Union a *next; double b; };,求联合体占用字节数
A 40
B 24
C 12
D 8
选项解析
32位环境:
int p[3]:(3\times 4 = 12) 字节Union a *next:指针 4 字节double b:8 字节
共用体(联合体)整体大小 = 最长成员的字节数 ,无需额外整体对齐填充。
最长成员为 int p[3],占用 12 字节。
答案:C
知识点总结
联合体所有成员共享同一块内存,存储空间取决于字节数最大的成员。
ID: 9553
题目
64位机器中声明 int *p[8],占用的存储空间是多少字节
A 32
B 64
C 8
D 40
解析
int *p[8]是指针数组,每个元素是int*指针,64位平台下指针大小为8字节。- 总大小:
8×8=64字节。
答案:B
知识点总结
64位平台下指针大小为8字节,指针数组总大小=元素个数×8。
ID: 9554
题目
32位机器中声明 char (*p)[8],占用的存储空间是多少字节
A 32
B 16
C 8
D 4
解析
char (*p)[8]是指向长度为8的char数组的指针。- 指针的大小由平台决定,32位平台下指针大小为4字节。
答案:D
知识点总结
32位平台下指针大小为4字节,无论指向何种类型,指针本身大小固定。
ID: 9480
题目
关于指针的说法,错误的是
A 每个指针都有一个值
B 运算符 * 用于指针的间接引用
C 将指针从一种类型强制转换成另一种类型,它的类型和值都会改变
D 数组与指针紧密联系
解析
- A:指针存储内存地址,必然有一个值,正确。
- B:
*p用于访问指针指向的内容,即间接引用,正确。 - C:指针强制转换仅改变其类型解释,不改变存储的地址值,错误。
- D:数组名可隐式转换为指向首元素的指针,二者联系紧密,正确。
答案:C
知识点总结
指针强制转换仅改变类型解释,不改变其存储的地址值。
ID: 9643
题目
声明数组 int A[5][3],起始地址为 XA,则 A[3][1] 的地址为
A XA+12
B XA+16
C XA+40
D XA+52
解析
- 二维数组按行优先存储,
int占4字节。 A[3][1]前面有3行完整的行(A[0]~A[2]),每行3个元素,加上A[3]中的1个元素,总偏移量:(3×3 + 1) × 4 = 10×4=40字节。- 地址为
XA + 40。
答案:C
知识点总结
二维数组行优先存储,元素地址=基地址 + (行号×列数 + 列号)×元素大小。
ID: 9646
题目
定义 int x, *pb;,正确的赋值表达式是
A pb = &x
B pb = x
C *pb = &x
D *pb = *x
解析
- A:
&x是变量x的地址,赋值给指针pb,正确。 - B:将
int变量赋值给指针,类型不匹配,错误。 - C:
*pb是指针指向的内容,需赋值int值,而非地址,错误。 - D:
x不是指针,不能用*x间接引用,错误。
答案:A
知识点总结
指针存储地址,赋值时需用 & 取变量地址。
ID: 9717
题目
声明语句 int *f(); 中,标识符 f 代表的是
A 指向整型数据的指针变量
B 指向一维数组的行指针
C 指向函数的指针变量
D 返回值为指针型的函数名
解析
int *f();是函数声明,f是函数名,该函数返回值为int*(整型指针)。
答案:D
知识点总结
类型 *函数名(); 表示返回值为对应类型指针的函数声明。
ID: 9586
题目
关于结构体存储对齐规则,说法错误的是
A 结构的首地址必须是最小元素字节数的整数倍
B 结构中每个数据的地址必须是其字节数的整数倍
C 结构的总体长度必须是最大元素字节数的整数倍
D 结构体中元素按照定义顺序放入内存
解析
- A:结构体首地址需对齐到最大成员的对齐单位,而非最小元素,错误。
- B:每个成员的地址需是自身大小的整数倍,正确。
- C:结构体总长度需对齐到最大成员的大小,正确。
- D:结构体成员按定义顺序存储,中间可能填充对齐字节,正确。
答案:A
知识点总结
结构体对齐规则:首地址按最大成员对齐、成员按自身大小对齐、总长度按最大成员大小对齐。
ID: 9667
题目
32位Linux系统下,struct{ char c; int a; } 所占字节数为
A 5
B 8
C 10
D 不确定
解析
char c占1字节,为满足int a(4字节)的对齐要求,c后填充3字节,a占4字节。- 总长度:
1+3+4=8字节。
答案:B
知识点总结
结构体成员间需按自身大小对齐,不足时填充字节。
ID: 9668
题目
32位Linux系统下,struct{ char *cp; int a; } 所占字节数为
A 4
B 8
C 12
D 16
解析
char *cp是指针,32位下占4字节,int a占4字节。- 二者大小均为4字节,无需额外填充,总长度:
4+4=8字节。
答案:B
知识点总结
结构体成员大小相同时,无需额外对齐填充。
ID: 9690
题目
定义数组 short A[7],short 占2字节,起始地址为 Xa,则 A[2] 的地址为
A Xa+2
B Xa+4
C Xa+6
D Xa+8
解析
A[2]是数组第3个元素(索引从0开始),偏移量为2×2=4字节。- 地址为
Xa + 4。
答案:B
知识点总结
一维数组元素地址=基地址 + 索引×元素大小。
ID: 9691
题目
比较 struct foo1 和 struct foo2,哪个更节省内存
A foo1
B foo2
C 没有区别
D 依计算机不同而不同
解析
- 结构体的填充字节取决于成员顺序,按成员大小从大到小排列可减少对齐填充。
foo2中double、long等大成员在前,小成员在后,减少了对齐填充,更节省内存。
答案:B
知识点总结
结构体成员按大小从大到小排列,可减少对齐填充,节省内存。
ID: 9462
题目
char *p 指针 p 占多少个字节
A 1
B 2
C 3
D 4
解析
- 指针的大小由系统的寻址能力决定,题目选项默认是32位系统。
- 32位系统中,所有指针的大小均为4字节,与指向的类型(
char/int/double等)无关。
答案:D
知识点总结
指针的大小等于系统的地址总线宽度(32位为4字节,64位为8字节),与指向的数据类型无关。
ID: 9575
题目
对于32位机器,char* 的字节数为
A 1
B 2
C 4
D 8
解析
- 32位机器的地址总线宽度为32位,因此所有指针类型的大小均为4字节。
char*是指向字符的指针,本身的大小仍由系统决定,为4字节。
答案:C
知识点总结
32位系统下,所有指针类型(包括char*、int*、void*等)的大小均为4字节。
ID: 9459
题目
C语言中,声明 int i,j 时,i 和 j 在内存中分配的地址肯定相邻,这种说法
A 正确
B 错误
解析
- C语言标准未规定局部变量在栈中的存储顺序,编译器可能根据优化、对齐要求调整变量位置。
- 例如,编译器可能在
i和j之间插入填充字节,或改变分配顺序,导致地址不相邻。
答案:B
知识点总结
C语言中,同一声明语句的局部变量地址不一定相邻,取决于编译器的实现与优化策略。
ID: 9485
题目
show_bytes 函数调用输出结果:const char *s="abcdef"; show_bytes((byte_pointer)s, strlen(s));
A a b c d e f
B 66 65 64 63 62 61
C 61 62 63 64 65 66
D f e d c b a
解析
show_bytes按字节依次输出字符串的ASCII码。"abcdef"的ASCII码依次为a(0x61)、b(0x62)、c(0x63)、d(0x64)、e(0x65)、f(0x66)。- 字符串按字节顺序存储,输出顺序与字符串顺序一致。
答案:C
知识点总结
字符串在内存中按顺序存储,show_bytes 按字节依次输出,不受大小端影响(字符为单字节)。
ID: 9602
题目
C语言中定义 int x, *p;,正确的赋值表达式是
A *p = *&x
B *p = &x
C *p = *x
D p = x
解析
- A:
&x取变量x的地址,*&x等价于x(取地址后解引用,即变量本身),将x的值赋值给*p(指针指向的内容),正确。 - B:
&x是地址,*p是int类型,类型不匹配,错误。 - C:
x不是指针,不能用*x解引用,错误。 - D:
x是int类型,p是指针,类型不匹配,错误。
答案:A
知识点总结
& 取变量地址,* 解引用指针;*&x 等价于变量x本身。
ID: 9650
题目
int len = strlen(s);,如果 s="hell",则 len=
A 4
B 5
C s 的首地址
D 0
解析
strlen函数计算字符串长度,不包含末尾的'\0'结束符。"hell"包含4个字符(h、e、l、l),因此长度为4。
答案:A
知识点总结
strlen 返回字符串中有效字符的个数,不包含末尾的'\0'。
ID: 9652
题目
字符串 "\ta\017bc" 的长度(不包括结束符)是
A 9
B 5
C 6
D 7
解析
- 逐个分析转义字符:
\t:制表符,1个字符a:普通字符,1个字符\017:八进制转义字符,1个字符b:普通字符,1个字符c:普通字符,1个字符
- 总长度为5。
答案:B
知识点总结
C语言中,转义字符(如\t、\017)均作为单个字符处理,strlen 统计其个数。
编译、汇编、链接、调试
ID: 9432
题目
C语言程序编译运行过程中,不能用文本编辑器直接打开查看的二进制文件是
A hello.s
B hello.i
C hello.c
D hello.o
解析
- A:
hello.s是汇编文件,文本格式,可直接查看。 - B:
hello.i是预处理后的源文件,文本格式,可直接查看。 - C:
hello.c是C源文件,文本格式,可直接查看。 - D:
hello.o是目标文件(机器码+重定位信息),二进制格式,无法直接用文本编辑器查看。
答案:D
知识点总结
C程序编译生成的中间文件中,目标文件(.o)和可执行文件为二进制文件,其余(.c/.i/.s)为文本文件。
ID: 9434
题目
GCC编译时,生成调试信息的附加参数是
A -o
B -g
C -S
D -E
解析
- A:
-o用于指定输出文件名。 - B:
-g用于在可执行文件中嵌入调试信息,供GDB等调试工具使用。 - C:
-S用于生成汇编文件(.s)。 - D:
-E用于仅执行预处理,生成预处理后的文件(.i)。
答案:B
知识点总结
gcc -g 参数用于在编译时生成调试信息,是GDB调试的前提条件。
ID: 9486
题目
C文件翻译为可执行文件的四个阶段,排序正确的是
A 预处理 → 编译 → 汇编 → 链接
B 预处理 → 汇编 → 编译 → 链接
C 预处理 → 汇编 → 链接 → 编译
D 预处理 → 编译 → 链接 → 汇编
解析
C程序的完整编译流程:
- 预处理(
-E):处理宏定义、头文件包含,生成.i文件。 - 编译(
-S):将预处理后的文件翻译为汇编代码,生成.s文件。 - 汇编(
-c):将汇编代码翻译为机器码,生成目标文件.o。 - 链接:将多个目标文件和库文件链接为可执行文件。
答案:A
知识点总结
C程序编译流程:预处理 → 编译 → 汇编 → 链接。
ID: 9653
题目
汇编器(as)将hello.s翻译成
A C程序
B 文本文件
C 机器语言指令
D 可执行文件
解析
hello.s是汇编代码文件,汇编器as的作用是将汇编指令翻译成机器语言指令,生成目标文件hello.o。- 目标文件包含机器码,但还未经过链接,不是完整的可执行文件。
答案:C
知识点总结
汇编器将汇编代码翻译为机器语言指令,生成目标文件(.o)。
ID: 9677
题目
Linux中,hello.c到hello.out的顺序为:1预编译、2链接、3编译、4汇编
A 1234
B 1243
C 1342
D 1324
解析
对应编译流程:
- 预编译(预处理)→ 3. 编译 → 4. 汇编 → 2. 链接
即顺序为1 → 3 → 4 → 2。
答案:C
知识点总结
C程序编译的完整顺序:预处理(预编译)→ 编译 → 汇编 → 链接。
ID: 9596
题目
GDB命令 x/17xw sum 中,参数w表示
A 单字节
B 双字节
C 四字节
D 八字节
解析
GDB中x命令的单位参数:
b:单字节(1字节)h:双字节(2字节)w:四字节(4字节,即word)g:八字节(8字节)
答案:C
知识点总结
GDB的x命令中,w表示以四字节为单位查看内存。
ID: 9714
题目
关于编译器优化,错误的说法是
A 编译器优化依然需要程序员在高级语言编写时考虑性能问题
B 编译器的优化有时会导致最终代码与源程序码大相径庭
C 既然有不同优化,应选择最高优化级别以获取最佳性能
D 不同编译器的优化也会不同
解析
- A:正确,编译器优化无法解决算法级别的低效,程序员仍需考虑性能。
- B:正确,如循环展开、常量传播等优化会改变代码结构。
- C:错误,最高优化级别(如
-O3)可能导致编译时间过长、调试信息丢失,甚至引入兼容性问题,并非所有场景都适用。 - D:正确,不同编译器(如GCC、Clang)的优化策略存在差异。
答案:C
知识点总结
编译器优化级别并非越高越好,需根据场景选择(如调试用-O0,发布用-O2)。
ID: 9698
题目
插入printf()声明的阶段是
A 预处理阶段
B 编译阶段
C 链接阶段
D 汇编阶段
解析
printf()的声明在头文件stdio.h中,预处理阶段会处理#include <stdio.h>,将头文件内容(包括printf的声明)插入到源文件中。
答案:A
知识点总结
预处理阶段处理头文件包含、宏定义等,会将头文件中的函数声明插入到源文件中。