1、对于以下结构定义,(*p)->str++中的++加在()
struct { int len; char *str; } *p;
A、指针 str 上
B、指针 p 上
C、str 指向的内容上
D、语法错误
答案:D
解析:结构体指针的两种用法:
1、p -> str
2、(*p).str。
本题中的用法是非法的,所以选择选项D。
2、 以下代码输出什么?int a = 1, b = 32; printf("%d,%d", a << b, 1 << 32);
A、1,1
B、1,0
C、0,0
D、取决于编译器
答案:D
解析:本题中的移位表达式是不合法的,出现什么结果也是未定义的,具体要看使用的编译器对这种情况如何处理,所以选择选项D。
在实际编译器中书写这样的代码,可能由于编译器的原因出现如下结果:
以n << m为例,当m和n中至少有一个是变量时,进行的移动是循环移动,在左端移出的数会从右端移入。当m和n中两个都为常量时,移出就是移出。
3、 math.h的abs返回值()A、不可能是负数
B、不可能是正数
C、都有可能
D、不可能是0
答案:C
解析:abs的功能为求一个数的绝对值,那么正数和零一定可能为返回值。负数是如何来的呢?以八位二进制数为例,其范围是-128~127,我们可以看到其负数的范围比正数的范围大,那么我进行abs(-128)就不能返回128,只能返回原值-128。综上,选择选项C。
4、 下面程序的输出结果是()
cpp#include <iostream> using namespace std; int main() { char str1[] = "hello world"; char str2[] = "hello world"; const char str3[] = "hello world"; const char str4[] = "hello world"; const char* pstring1 = "hello world"; const char* pstring2 = "hello world"; cout << boolalpha << ( str1==str2 ) << ',' ; cout << boolalpha << ( str3==str4 ) << ',' ; cout << boolalpha << ( pstring1==pstring2 ) <<endl; return 0; }
A、false,false,true
B、false,false,false
C、true,true,true
D、false,true,true
答案:A
解析:以 cout << boolalpha << ( str1==str2 ) << ',' ;为例,进行的是比较str1和str2的值,并返回一个布尔类型,而对str1和str2的比较实际上是地址的比较。我们知道地址具有唯一性,所以前两个输出都为false。而第三个比较中,两个指针都指向了同一字符串常量,所以两个指针的值应该是相同的,所以第三个输出为true。
5、 若有定义
cpptypedef char T[10] ; T * a ;
上述定义中a的类型与下面选项中完全相同的是?
A、char a[10] ;
B、char (*a)[10] ;
C、char * a ;
D、char *a[10] ;
答案:B
解析:在上述代码中,typedef用于给一个类型起别名,对于较为复杂的类型,将别名去掉即为被起别名的类型。所以本题中,T的类型是一个字符数组。观察T * a,类比int * a,那么a为指针类型,这个指针指向的是一个字符数组,所以a是一个数组指针。综上,选择选项B。
6、 若有以下说明和定义语句:
cppunion uti { int n; double g; char ch[9]; } struct srt { float xy; union uti uv; } aa;
考虑内存对齐,则变量aa所占内存的字节数是( )
A、9
B、8
C、24
D、13
答案:C
解析:这里是结构体内嵌套了一个共用体,按照内存对其规则,先去寻找最大数据类型成员,为double占8字节。所以共用体应该开辟16字节的空间,结构体中float xy开辟8字节的空间,所以变量aa所占内存的字节数为24,选择选项C。
7、有如下一段代码(unit16_t为2字节无符号整数,unit8_t位1字节无符号整数);
cppunion X { unint16_t a; struct Z { unint8_t m; unint8_t n; }z; }; union X x; x.a = 0x1234;
请问x.z.n在大字节序和小字节序机器上的值分别为多少()
A、0x34,0x12
B、0x12,0x34
C、0x1234,0x1234
D、0x1234,0
E、0,0x1234
答案:A
解析:本题中共用体中嵌套了一个结构体,首先由对其规则可以得到,公用体的大小为2字节。x是共用体变量,x.a = 0x1234,那么共用体2字节的空间正好存放。对于结构体中的两个成员,可以看成char arr[2],m是arr[0],n是arr[1]。
假设在大字节序机器上(大端存储),那么低字节要存到高地址,高字节要存到低地址,那么从高地址到低地址存放的是0x3412,n中存的是高地址中的数据为0x34。
假设在小字节序机器上(小端存储),那么低字节要存到低地址,高字节要存到高地址,那么从高地址到低地址存放的是0x1234,n中存的是高地址中的数据为0x12。
8、 开发C代码时,经常见到如下类型的结构体定义:
cpptypedef struct list_t{ struct list_t *next; struct list_t *prev; char data[0]; }list_t;
最后一行char data[0];的作用是?
A、方便管理内存缓冲区
B、减少内存碎片化
C、标识结构体结束
D、没有作用
答案:AB
解析:char data[0]; 在C语言中被称为"柔性数组成员"。它的主要目的是允许结构体在末尾有一个可变大小的数组,从而使得整个结构体可以作为一个连续的内存块进行分配和管理。使用柔性数组成员可以有助于减少因多次分配不同大小的内存块而导致的碎片化。综上,选择选项AB。
9、参考以下代码,在大端字节机器中x.c的值为
cppunion A { short c; char buf[4]; } x = {0x01, 0x02, 0x03, 0x04};
A、0x102
B、0x201
C、0x304
D、0x403
答案:A
解析:在大端字节机器中,地址从高到低存储的为:0x01020304。成员c和buf共址,在大端存储下,高地址为现在的首地址,所以输出x.c应为0x102。
10、在 32 位 cpu 上选择缺省对齐的情况下,有如下结构体定义:
cppstruct A { unsigned a : 19; unsigned b : 11; unsigned c : 4; unsigned d : 29; char index; };
则 sizeof(struct A) 的值为()
A、9
B、12
C、16
D、20
答案:C
解析:在解决这道题前,要先了解一下位域的概念。
C语言中的位域是一种数据结构,它允许在结构体中定义其成员占用的位数,而不是通常的字节数。位域的主要目的是节省内存,特别是在需要存储大量位(bit)数据但每个数据项不需要一个完整字节(8位)的情况下。位域的定义是在结构体内部,通过指定成员的类型后跟一个冒号和一个数字来完成的,这个数字表示该成员应该占用的位数。以unsigned a : 19;为例,19表示该成员占19bit。
在32位CPU选择缺省对齐的情况下,每个位域支持32位。同时,一个位域必须存储在一个字节中,不能够跨两个字节。所以a和b占用四个字节,c占用四个字节,d占用四个字节,index占四个字节。共占用16个字节,选择选项C。
刷c语言练习题10(牛客网)
拒绝头秃从我做起2024-10-23 9:22
相关推荐
LKID体几秒前
Python操作neo4j库py2neo使用之py2neo 删除及事务相关操作(三)小屁孩大帅-杨一凡2 分钟前
Python-flet实现个人视频播放器算家云5 分钟前
快速识别模型:simple_ocr,部署教程Thomas_Cai16 分钟前
Python后端flask框架接收zip压缩包方法霍先生的虚拟宇宙网络18 分钟前
webp 网页如何录屏?温吞-ing20 分钟前
第十章JavaScript的应用魔道不误砍柴功27 分钟前
实际开发中的协变与逆变案例:数据处理流水线ö Constancy27 分钟前
Linux 使用gdb调试core文件lb363636363628 分钟前
介绍一下strncmp(c基础)wellnw33 分钟前
[linux] linux c实现共享内存读写操作