C和指针小测验改错

来源:互联网 发布:手机sd卡数据免费恢复 编辑:程序博客网 时间:2024/05/21 17:16
1. 给出以下定义,下列哪些操作是合法的(A)
const char* p1 = “hello”;
char* const p2 = “world”;
A.p1++;     B.p1[2] = ‘w’;     C.p2[2] = ‘l’;     D.p2++;
解析:const:定义常变量,变量变成只读,即不能做左值,字符串常量不允许修改,所以B、C错误!const修饰p2,所以p2不允许修改,D错!
2. 下面结构体
struct s1
{
char ch,*ptr;//1+3,4
union
{
    short a,b;//2,2
    unsigned int c:2,d:1;//(2+1) 所以是1+3=4
};  //4
struct s1 *next;//4
};
sizeof(struct s1)是(16字节)
3. 使用malloc系统调用分配的内存是在(堆)上分配
4.求(p-(char *)(st)的值
#include<stdio.h>
int main()
{
struct st_t
{
int status;//4
short *pdata;//4
char errstr[32];//32  32+4+4 = 40 恰好是sizeof(int)的倍数
};
printf("%d ",sizeof(st_t));
struct st_t st[16];
char *p = (char *)(st[2].errstr+32);
printf("%d ",(char *)st);
printf("%d ",(char *)(st[0].errstr+32));//注意(char *)(st[0].errstr+32)和(char *)(st)的区别
printf("%d ",(p-(char *)(st)));//120
return 0;
}
4. 以下代码执行后,val的值是(21064)
unsigned long val = 0;
char a = 0x48;
char b = 0x52;
Val = b<<8|a;
计算方法:注意:位移的优先级高,“|”其实在这道题中也就是加,注意:向左移8位其实就是乘以2^8
5. 设有定义:char *p;以下选项中不能正确将字符串赋值给字符类型指针p的语句是(AD)
A.p = getchar();//error getchar()只能得到一个字符
B.scanf(“%s”,p);
C.char s[] = “china”;p = s;
D.*p = “china”;//error 指针解引用不可能是一个字符串
6.设有以下函数
int f(int a,char *b){}
则下面对函数指针的定义和赋值错误的是(BC)
A. int (*p)(int,char *);p = f;
B. int *p(int,char *);p = f;
C. int (*p)(int,char );p = f;
D. int (*p)(int,char *);p = &f;
6. 在64位系统下,分别定义如下两个变量:char *p[10];char(*p1)[10];sizeof(p)和sizeof(p1)分别是多少?//80  8
解析:首先,在64位平台上,指针占8个字节,注意:区分char *p[10](保存指针的数组)和char p[10](数组)
7.(找规律)用十进制计算30!,将结果转换成3进制进行表示的话,该进制下的结果末尾会有(14)个0
解析:我们先看20!转换成10进制,即看20以内10的倍数有几个,10又等于2*5,因为2很多,而5是个稀缺资源,所以只找5的个数,所以对于这道题我们只找3的个数就可以了
30*29*28*27*26*25*24*23*22*21*20*19*18*17*16*15*14*13*12*11*10*9*8*7*6*5*4*3*2*1
8.设x、y、t均为int型变量,则执行语句:t = 3;x=y=2;t=x++||++y;后,变量t和y的值分别为(1,2)
9.下面代码在64位Linux系统编译执行,输出结果是(40,8)注意:int在32位和64位操作系统下,都是4个字节,指针在这两个平台分别是4,8
#include<stdint.h>
#include<stdio.h>
Void print_size(int32_t array[10])
{
    printf(“%d\n”,sizeof(array));
}
int main()
{
int32_t myArray[10];
printf(“%d\n”,sizeof(myArray));
print_size(myArray);
}
10.关于系统调用和库函数的简单判断方法:
加f是C库中的函数,比如:fopen,fclose,fwrite,fread
不加f是系统调用,比如:read
11.使用一辆卡车运输n块单块1TB装满数据的硬盘,以时速80km/h行驶1000km将数据运送到目的地;卡车至少运送(E)块硬盘才能使运输速率超1000Gps(注意:这个单位是bit/s)
A.2000   B.3000  C.4000  D.5000  E.6000   F.7000
解析:字节换算单位:
B(字节)    KB(千字节)    MB(兆字节)    GB(千兆字节)    
1T = 1024G     1GB = 1024MB      1MB= 1024 KB     1KB = 1024 B  
B:Byte;b:bit  现在只有中国电信用bit作单位,如100Mbit
计算:时间:1000/80 = 12.5h   
(n*1000*8)/(12.5*60*60)>1000
12.test.c文件中包括如下语句:
#define INT_PTR int*
Typedef int* int_ptr;
INT_PTR a,b;
Int_ptr c,d;
哪个不是指针类型?   b
注意:宏和typedef的区别
13.(这道题虽然没错,但是很典型呢)在小端序的机器中,如果
Union X
{
int x;
char y[4];
};
如果X a;a.x=0x11223344;则下面哪个是对的:
正确的是:y[3] = 11;
14.假设在n进制下,下面的等式成立,567*456=150216,n的值是()
A.9  B.12  C.10  D.18
解析:求一个数字是几进制表示
1) 将这个数字对n取余,因为其他都是n的倍数
a.n>6
(7(567的个位)*6(456的个位))%n == 6,把n带入,n可取9、12、18,C错
(5*n^2+6*n+7)*(4*n^2+5*n+6) = 1*n^5+5*n^4+2*n^2+1*n^1+6
即:20*n^4+49*n^3+88*n^2+71*n+42=n^5+5*n^4+2*n^2+n+6
两边同时除以n的倍数,得n==18
15.声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是(C)
A.int (*p[10])(int*)
B.int *p[10](int*)
C.int (*(*p)[10])(int *)
D.int ((int *)[10])*p
16.有如下规约:
digit->0|1|…|9
digits->digit digit*
optionalFraction->.digits|
optionalExponent->(E(+|-|)digits)|
number->digits optionalFraction optionExponent
对于上面给出的正则规约的描述,下列无符号数中,不符合规约要求的是(D)
A.5280   B.1    C.2.0   D.336E
解析:科学计数法的表示:1.23的3次方:1.23E+3或1.23E3   也就是说E后面必须跟次幂
1.23的-3次方:1.23E-3    336的0次方:336E0