1.下列函数定义中,有语法错误的是()
A.void fun(int x,int *y)
{x* = *y;}
B.int *fun(int *x,int y)
{return x+=y;}
C.void fun(int *x,int y)
{*x += y;}
D.void fun(int x,int *y)
{*x = *y;}
这道题首先要明确指针的作用以及指针的用法,指针保存一个地址,整型浮点型数据不能随意加*,因为整型这些类型的值和指针的关系是由指针解引用得到的,所以D错,x为整型不能作为地址被解引用。
答案:D
2.给出以下定义,下列哪些操作是合法的()
const char* p1 = “hello”;
char* const p2 = “world”;
A.p1++;
B.p1[2] = ‘w’;
C.p2[2] = ‘l’;
D.p2++;
这道题要明确const具体修饰指针哪个位置的作用,const char* p = char const *p;
它代表将指针指向的内容常量化,即内容不能被修改;而char *const p则代表,p当前的地址不能修改,而它的内容可以修改,所以p1不能执行赋值,p2不能执行指针移动。
答案: A
3.下面结构体
struct s1
{
char ch,*ptr;
union
{
short a,b;
unsigned int c:2,d:1;
};
struct s1 *next;
};
sizeof(struct s1)是():
A.12字节
B.16字节
C.20字节
D.24字节
结构体不同的类型写前写后是有不同的大小的,它涉及内存对齐,具体请参考C和指针还有C语言深度剖析都有讲到,而联合体Union由于所有变量共用一份空间,即取最大字节类型变量的大小即可。因为内存对齐,char ch,ptr*因为指针4个字节,则ch原本占一个字节为了对齐也创建4个字节即共8个字节,联合体里最大为整型4个字节,最后一个结构体类型指针4个字节(所有指针都是4个字节,在32为操作系统)。
答案:B
4.下面程序,求count的值是()
int func(int x)
{
int count = 0;
x = 9999;
while(x)
{
count++;
x = x&(x-1);
}
return count;
}
A.8
B.10
C.5
D.11
这是一道设计位运算的题,这个程序将x转化为2进制,看含有的1的个数。9999&9998,9998&9997,每执行一次x = x&(x-1),会将x用二进制表示时最右边的一个1变为0,从1到k-1位全是1,按位与的结果自然就是第k位和1~k-1位都变成0。9999二进制应该为10011100001111,所以应该为8个1
答案:A
5以下代码打印的结果是()(假设在i386系列计算机上)():
struct st_t
{
int status;
short *pdata;
char errstr[32];
};
struct st_t st[16];
char p = (char )(st[2].errstr + 32);
printf(“%d”,(p-(char*)st));
A.32
B.114
C.120
D.1112
此时这个p指针知道了结构体数组第三个末尾则一个结构体数组元素40个字节,3个120个字节
答案:C
6.以下代码执行后,val的值为():
unsigned long val = 0;
char a = 0x48;
char b = 0x52;
val = b << 8 | a;
A.20992
B.21064
C.72
D.0
我们来看一下编译器VS2008给出的反汇编代码
val = b << 8 | a;
003D13D4 movsx eax,byte ptr [b]
003D13D8 shl eax,8
003D13DB movsx ecx,byte ptr [a]
003D13DF or eax,ecx
003D13E1 cdq
003D13E2 mov dword ptr [val],eax
003D13E5 mov dword ptr [ebp-8],edx
我们可以发现,char类型左移并不妨碍越界,因为它们是把值放在寄存器里然后再寄存器运算,而寄存器占4个字节,所以0x52二进制01010010左移8位0101001000000000,0x48(01010010前面补八个0)就是0000000001001000,答案转为十进制为21064
答案:B
7。设有定义:char *p;
,以下选项中不能正确将字符串赋值给字符型指针P的语句是()
A.p = getchar();
B.scanf(“%s”,p);
C.char s[] = “China”;p = s;
D.*p = “china”;
定义这个指针并没有赋值,所以它是一个野指针,所以B根本不能写进去,D更不能赋值,A也是错的,标准输入之前没有初始化指针。
答案:ABD
8.在64位系统下,分别定义如下两个变量:
char *p[10];
char(*p1)[10];
请问sizeof(p)和sizeof(p1)分别值为()
A.4,40
B.80,8
C.10,10
D.8,80
E.40,4
F.4,4
在64位系统下指针为8个字节,第一个p为指针数组,每个元素为指针,占4个字节,则sizeof(p)为40,第二个为数组指针,它是一个指针所以sizeof(p1)占8个字节。
9.用十进制计算30!(30的阶乘),将结果转换成3进制表示的话,该进制下的结果末尾会有()个0
A.6
B.8
C.10
D.12
E.14
F.16
十进制转三进制就是%3后所得余数在从后往前读出,30!三进制就是看1-30里面每个因子有多少个因数3,3,6,9(3*3)有两个3,12,15,18(3*3*2)有个三,21,24(3*8,4*3*2)两个3,27有三个三.
答案:E
10.设x,y,t均为int型变量,则执行语句:
t=3;
x=y=2;
t=x++ | ++y;后,变量t和y的值分别为()
A.t=1 y=2
B.t=1 y=3
C.t=2 y=2
D.t=2 y=3
E.t=3 y=2
F.t=3 y=3
这道题考的是运算符的优先级,自增运算符运行级别大于赋值运算符(赋值运算符优先级很低),而且同一个级别内 逻辑运算符比赋值运算符优先级高。所以x++ | ++y为1,t =1;而逻辑或运算前面为真后面就不执行则,y= 2;
答案:A
11.使用一辆卡车运输n块单块1TB装满数据的硬盘,以时速80km/h行驶1000km将数据运送到目的地;卡车至少运送()块硬盘才能使运输速率超1000Gbps
A 2000
B 3000
C 4000
D 5000
E 6000
F 7000
我们平时链接的宽带100M其实是100Mbps,而下载的速度10Mps,因为1B = 8b,
首先把时间换算成s,1000/80*3600 = 45000s,
1000 * 8(这是1T的容量换算成GB的位数)*n/45000 = 1000
n =6000
答案:E
12.test.c文件包含如下语句:
#define PTR int*
typedef int* int_ptr;
INT_PTR a,b;
int_ptr c,d;
文件定义的四个变量,哪个变量不是指针类型?
A a
B b
C c
D d
E 都是指针
F 都不是指针
宏定义为字符替换,它不是一种类型
而typedef是将原有类型定义为新的名字,是类型
所以INT_PTR a,b a是指针,b是整型。
答案:B
13.假设在n进制下,下面的等式成立,567*456=150216,n值是()
A.9
B.10
C.12
D.18
这道题考的是进制转换我们可以列一个等式算出n值,(5*n^2+6*n^1+7)*(4*n^2+5*n+6)=1*32+5*16+0+2*4+1*2+6
算出来n = 18
答案:D
14.有如下规约:
digit->0|1|…|9
digit->digit digit*
optionalFraction->.digits|
optionalExponent->(E+|-|digits)|
number ->digits optionalFraction optionlExponent
对于上面给出的正则规约描述,下列无符号数中,不符合规约要求的是()
A.5280
B.1
C.2.0
D.336E
这道题看起来很没有头绪,这道题从最后一个来看,它包含了上面几行的约定,所以推断应该是一个筛选合格约定的数字我们来看一看,5280里面的数字选数首先5280符合0-9,digit*是意思组合5280就是5 2 8 0组合起来,optionalFraction可以加.当作小数,5280可以为5280.可以为5280,optionalExponent意思是有E后面就要有加减运算,1和2.0也符合,只有336E后面没+/-。所以D错
答案:D
15.int Fun(int x,int y)
{
return (x&y) + (x^y)>>1;
}
则运行Fun(729,271);结果是()
A.499
B.500
C.501
D.502
这道题从左边括号看,(x&y),按位与相同为1,我们可以认为这步运算是把他们相同的部分取出来,然后(x^y),异或把不同的位数取出来为1右移一位,剩下为0,两个相加,相同的部分取一份,不同的部分除2,就是求平均数。
答案:B