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
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
阅读全文
0 0
- C和指针小测验改错
- Objective-C小测验总结
- Objective-C Blocks 小测验
- (面试)C语言指针程序改错题
- c和指针_小感悟
- C语言的特点及程序小测验
- 智力小测验
- 智力小测验
- sizeof() 小测验
- OJ 期末小测验
- HTML 小测验记
- [bzoj4635]数论小测验
- 前端知识小测验
- 省会城市小测验
- Android 小测验
- c语言程序改错
- C语言改错
- 【C++】改错题总结
- lucene UnifiedHighlighter高亮组件
- DedeCMS让{dede:list}标签支持weight权重排序
- CSS3实现loading(加载)动画效果
- Spring-boot 配置Jetty 容器
- 导入oracle数据库时卡顿问题
- C和指针小测验改错
- Azure 中 Windows 虚拟机的大小
- CentOS7安装Docker全程并启动
- 如何正确理解三极管的放大区、饱和区、截止区
- java编程求:∑1+∑2+...+∑100
- Log4j中DailyRollingFileAppender日志文件清理策略
- springMVC中通用的分页配置
- PHP中的命名空间
- android中卡号输入框控件(每四位用空格分隔)(解决输入法跳转的问题)