如果大家对读研究生和就业不知道如何抉择,我的建议是看大家的经济基础,如果家里不是很需要你们工作,就读研提升自己的学历,反之就就业;毕竟经济基础决定上层建筑;
第一题
1. 下面代码的结果是:( )
#include <stdio.h>
int main()
{
int arr[] = {1,2,(3,4),5};
printf("%d\n", sizeof(arr));
return 0;
}
A.4
B.16
C.20
D.5
答案及解析 B
本题考查的是逗号表达式和sizeof,不知道大家看没看到逗号表达式;
数组arr = {1, 2, (3, 4), 5};里面有一个逗号表达式,结果为最后一个表达式的值;
所以arr = {1, 2, 4, 5};
sizeof数组名,计算的是整个数组的大小哦
则sizeof(arr) = 4 * 4 = 16;
第二题
2. 下面代码说法正确的是()
char str1[] = "abcdefg";
char str2[] = { 'a','b','c','d','e','f','g'};
A.数组str1和数组str2等价
B.数组str1和数组str2的长度相同
C.sizeof(str1)>sizeof (str2)
D.strlen (str1)>strlen (str2)
答案及解析 C
本题考查的是你对字符数组和字符串的认识;
字符串是指默认末尾有隐藏\0的;而字符数组是默认没有的;
sizeof计算的是占用的空间,包含\0;
而strlen是计算的长度,以\0为结束标志;
A:错误,字符串是默认末尾包含\0,而字符数组不是;
B:长度指的是strlen求的结果,因为我们不知道是str2的\0在什么位置
所以strlen(str2) ≥ strlen(str1)
C:正确,因为str1多个隐藏的\0;
D:看B;
第三题
3. 下面代码的结果是:( )
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5};
short *p = (short*)arr;
int i = 0;
for(i=0; i<4; i++)
{
*(p+i) = 0;
}
for(i=0; i<5; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
A.1 2 3 4 5
B.0 0 3 4 5
C.0 0 0 0 5
D.1 0 0 0 0
答案及解析 B
其实吧,对于我们期末考试来说,这种题已经够用了,算的上是相对的难题了,毕竟是涉及指针的知识,但是如果你是要学好,学扎实,这种题你不能认为是难题;
我们要用二进制数表示数组中元素;1字节= 8个比特位 int为4字节 short为2字节
先明确下面知识点
1. 对指针的加法,是表示移动的字节数,这个字节数是根据指针指向的内容的数据类型来的
2. 解引用的时候取的字节数也是根据指针指向的内容的字节数来的;解引用要从低地址开始
3. 这里还涉及大小端,但是先不用这个讲解
第四题
4. 下面程序的结果是:( )
int main()
{
int aa[2][5] = {10,9,8,7,6,5,4,3,2,1};
int *ptr1 = (int *)(&aa + 1);
int *ptr2 = (int *)(*(aa + 1));
printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));
return 0;
}
A.1, 6
B.10, 5
C.10, 1
D.1, 5
答案及解析
本题画图解释
二维数组可以当成存放多个一维数组的首元素地址的数组;
所以二维数组的数组名其实是一个二级指针;
第五题
5. 下面代码输出的结果是()【32位系统】
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = -3;
unsigned int b = 2;
long c = a + b;
printf("%ld\n", c);
}
A:-1
B:4294967295
C:0x7FFFFFFF
D:0xFFFFFFFF
答案及解析 A
本题考查的是对隐式类型转换的理解;什么是隐式类型转换呢?
在进行运算操作的时候,我们两边的操作数的数据类型是不同的;
比如进行加减乘除,比较和赋值运算的时候,数据类型的不同,就会发生隐式类型转换;
规则:
1. 有符号数转换成无符号数,低字节转换为高字节;
2. 赋值运算符,若左操作数字节是小于右操作数的,会发生截断;
二进制要用补码计算
正数的补码就是原码
负数的补码:原码按位取反+1
负数的原码:补码按位取反+1
a + b ,因为b是无符号数,所以
a:原码 1000 0000 0000 0000 0000 0000 0000 0011
反码 1111 1111 1111 1111 1111 1111 1111 1100
补码 1111 1111 1111 1111 1111 1111 1111 1101
b:补码 0000 0000 0000 0000 0000 0000 0000 0010
因为a + b ,a 会转换成无符号整数,但其实a不会变,a会拷贝一个临时变量作为a的无符号数,所以:
a的临时变量的补码:1111 1111 1111 1111 1111 1111 1111 1101
b的补码: 0000 0000 0000 0000 0000 0000 0000 0010
a + b :1111 1111 1111 1111 1111 1111 1111 1111
但是c为long类型,是有符号的,32位下long是4字节,
c = a + b
c的补码:1111 1111 1111 1111 1111 1111 1111 1111
c是有符号的
反码:1000 0000 0000 0000 0000 0000 0000 0000
原码:1000 0000 0000 0000 0000 0000 0000 0001
最后c = -1