第一题
1. i = 5,j = 7,i | j 等于多少?
A:1
B:3
C:5
D:7
答案及解析 D
|这个是按位或运算符,两个数的二进制位,有1为1,同0为0;
i的二进制:0101
j的二进制:0111
结果: 0111 = 7
第二题
2. 编译和执行如下c语言代码,系统将会输出什么?
#include <stdio.h>
int main()
{char c = '0';printf("%d %d", sizeof(c), sizeof(char));return 0;
}
A:1 4
B:2 2
C:1 1
D:2 1
答案及解析 C
sizeof是计算数据类型的空间;
这就表明了,sizeof括号里的变量是什么数据类型,计算出的结果就是该数据类型对应的字节,如果sizeof括号里面是个表达式,需要计算的,记住,sizeof只是算数据类型的空间,并不会计算表达式,只会推测这个表达式的数据类型;
第三题
3. 下面代码段输出的结果是()
int **pp, *p, a=10, b=20;
pp = &p;
p = &a;
p = &b;
printf("%d,%d", *p, **pp);
A:10 10
B:10 20
C:20 10
D:20 20
答案及解析 D
这里是涉及一级指针和二级指针的知识,先给大家画个图:
首先pp是一个二级指针,存的是一级指针的地址,存的是p指针的地址;
其次p指针,先后存放的是a的地址,b 的地址
最后p是存b的地址;
一级指针存的是对应变量的地址,一级指针解引用是取到的这个变量;
二级指针存的是一级指针的地址,二级指针解引用一次,取到这个一级指针,再解引用是取到这个一级指针指向的变量;
第四题
4. 在64位系统以及64位编译器下,以下描述正确的是()
struct T
{char a;int *d;int b;int c:16;double e;
};
T *p;
A:sizeof(p) == 24
B:sizeof(*p) == 24
C:sizeof(p->a) == 1
D:sizeof(p->e) == 4
答案及解析 C
本题考查的是对指针类型的理解和结构体的内存对齐;
相关博客:C/C++内存对齐规则(结构体、联合体、类)-CSDN博客
64位系统的指针类型占8字节,32位系统的指针类型占4字节;
结构体类型指针,访问内部数据要用 ' -> ',结构体变量访问内部数据用 ' . '
A:错误:p是一个结构体指针类型,只要是指针就是4/8个字节,而系统为64位,结果为8
C:正确:p->a 的数据类型是char类型,字节为1,结果正确
D:错误:p->e 的数据类型是double,字节为8,错误
B:错误,需要计算结构体的内存,直接上图,知识点在上面博客:
这里有一个特殊的成员int c : 16;这个叫位段,简单理解就是你给c赋值,会发生截断(二进制),保留的位数就是冒号后面的值,这里也就是保留16个比特位;
比如你p->c = 10;
二进制:0000 0000 0000 1010
截断:/ 0000 0000 0000 1010
结果:10
比如你的二进制位:1111 1010 0001 0101 0011
截断:1111 / 1010 0001 0101 0011
结果:1010 0001 0101 0011
第五题
5. 下列程序的运行结果是 3, 5,请为横线处选择合适的程序( )
#include <stdio.h>struct S
{int n;char c[10];
} *p;int main()
{struct S a[3] = {{3, "abc"}, {5, "def"}, {7, "ghi"}};p = a;printf("%d,", (*p).n);printf("%d\n", ______);return 0;
}
A:(++p) -> n
B:(a+1) -> n
C:p++ -> n
D:(p+1) -> n
答案及解析 ABD
首先这是一个结构体的数组,很容易理解;数组每一个元素都是结构体;
所以我们一步一步来;
要想找到5,就需要找到这个结构体数组的第二个元素
方式:a + 1,p + 1;
之后再取到对应的结构体内部成员
方式:(a + 1)->n,(p + 1)->n
A:正确,++p是前置++,返回的是++之后的值,相当于p+1
B:正确
C:错误,p++是后置++,返回的是++之前的值,相当于p,取到的是3
D:正确