刷c语言练习题7(牛客网)

1、函数fun的声明为int fun(int *p[4]),以下哪个变量可以作为fun的合法参数()

A、int a[4][4];

B、int **a;

C、int **a[4]

D、int (*a)[4];

答案:B

解析:如果是fun的合法参数,那么其类型应该与定义函数fun中的参数类型一致。这里传入的p是一个指针数组的数组名,故p是一个指针,指向的是一个指针数组的首地址,又数组中每一个元素也都是一个指针,所以指针p应该是一个二级指针,符合条件的是选项B。
2、 下列代码的运行结果()

|-------|------------------------------------------------------------------------------|
| 1 2 3 | short i = 65537; int j = i + 1; printf``(``"i=%d,j=%d\n"``, i, j); |

A、i=65537,j=65538

B、i=1,j=2

C、i=-1,j=0

D、i=1,j=65538

答案:B

解析:65537如果用int来表示应该为1 0000 0000 0000 0001,共17bit位,但是现在以short来存储,只能存下1。或者从另外一个角度来看,有符号short的范围是-32768~32767,只能存下32767+32768=65535,再加一则进位,后面位归零,再加一存储的数为一。故i=1,j=2,选择选项B。
3、下面程序段中,for循环的执行次数是()

|-----|----------------------------------------------------------------------------------|
| 1 2 | char *s=``"\ta\018bc"``; for``(; *s != ``'\0'``; s++) ``printf``(``"*"``); |

A、9

B、5

C、6

D、7

答案:C

解析:根据循环结束条件,可得字符串中有效长度为几,for循环就执行几次。字符串中 '\t'为制表符,是一个转义字符。'\01'也是一个转义字符,虽然 ' \ '后加三个数字表示三位八进制,但是本题中'\'后的第三个数为8,不符合条件。综上,字符串的有效长度为6,故选择选项C。
4、下列程序的输出结果是

|----------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 | #include<string.h> #include<stdio.h> #include<iostream> using namespace std; int main(){ ``char p1[10] = ``"abcd"``, *p2, str[10] = ``"xyz"``; ``p2 = ``"ABCD"``; ``strcpy``(str + 2, ``strcat``(p1 + 2, p2 + 1)); ``printf``(``" %s"``, str); } |

A、xyabcAB

B、abcABz

C、ABabcz

D、xycdBCD

答案:D

解析:本题主要考查字符串相关函数。首先执行strcat(p1 + 2 , p2 + 1),其中指针p1 + 2指向字符数组p1的'c',p2 + 1指向字符串"ABCD"的'B',该函数实现将第二个参数字符串连接到第一个参数字符串的末尾,并且返回第一个参数字符串的首地址,所以连接之后返回的地址存储'c',连接之后字符串为"cdBCD"。然后执行函数strcpy(),它实现的功能是字符串的拷贝,并且返回拷贝后第一个字符串参数的首地址,所以完成拷贝后的字符串为"xycdBCD",选择选项D。
5、 函数a定义如下:

|-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 | int a(``int tab){ ``int n = tab-1; ``n |= n >> 1; ``n |= n >> 2; ``n |= n >> 4; ``n |= n >> 8; ``n |= n >> 16; ``return n; } |

调用函数a(666)返回的结果是()

A、1023

B、1024

C、666

D、528

答案:A

解析:665用二进制表示为10 1001 1001,右移一位为01 0100 1100,按位与后结果为: 11 1101 1101,右移两位为00 1111 0111,按位与后结果为:11 1111 1111。按照按位与的特性,后续运算中1的位数不会变少,所以最后的结果还是:11 1111 1111,即1023,选择选项A。本题是不停的让一个数按位与上它右移之后的数,结果是将其原来最高位以下位都置为1。如果是不停的让一个数按位与上它左移之后的数,那么最终结果应该是将原来为1的最低位以上的位都置为1.
6、 下列代码输出是()

|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 | char *a[] = {``"BEIJING"``, ``"SHENZHEN"``, ``"SHANGHAI"``, ``"GUANGZHOU"``}; char **pa[] = {a+``3``, a+``2``, a+``1``, a}; char ***ppa = pa; int main(``void``) { ``printf(``"%s, "``, **++ppa); ``printf(``"%s, "``, *--*++ppa+``3``); ``printf(``"%s, "``, *ppa[-``2``]+``3``); ``printf(``"%s"``, ppa[-``1``][-``1``]+``1``); } |

A、BEIJING, SHENZHEN, SHANGHAI,GUANGZHOU

B、SHANGHAI, JING, NGZHOU, HENZHEN

C、SHANGHAI,BEIJING, GUANGZHOU, SHENZHEN

D、SHANGHAI,EIJING,ZHOU,ZHEN

答案:B

解析:解决本题关键是要画图去理解各个指针的当前指向。a为一级指针数组,每一个指针指向对应字符串的首地址。pa为二级指针数组,每一个二级指针指向数组a中的对应元素。ppa为一个三级指针,指向数组pa的首地址。

**++ppa中,先执行++操作使指针ppa指向pa[1],然后第一次*取到指针a+2,第二次*取到a[2],以%s进行输出得到"SHANGHAI"。

*--*++ppa+3中,先执行++ppa使指针ppa指向pa[2],第一次*取到指针a+1,然后执行--操作使指针指向a[0],第二次*取到a[0],即指向字符串"BEIJING"的指针,然后+3使指针指向'J',最后以%s进行输出得到"JING"。

*ppa[-2]+3中,[ ]的优先级最高且[ ]和*等价,所以先执行*(ppa-2),得到指针a+3,然后执行*得到指针a[3],指针指向字符串"GUANGZHOU"首地址,然后执行+3,指针指向"N",最后以%s进行输出得到"NGZHOU"。

ppa[-1][-1]+1中,由于*和[ ]可以互换,原式可以化为*(*(ppa-1)-1)+1,上一个printf中执行的是ppa-2,并没有对ppa的指向进行改变,那么此时指针ppa仍然指向pa[2],执行*(ppa-1)后得到pa[1],执行*(*(pa-1)-1)后得到指针a[1],指针指向字符串"SHENZHEN",然后执行+1,指针指向'H',最后以%s进行输出得到"HENZHEN"。

综上,选择选项B。
7、 阅读以下程序,当输入数据的形式为12a345b789↙,正确的输出结果为()

|-------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 | int main() { ``char c1,c2; ``int a1,a2; ``c1 = ``getchar``(); ``scanf``(``"%2d"``,&a1); ``c2 = ``getchar``(); ``scanf``(``"%3d"``,&a2); ``printf (``"%d,%d,%c,%c\n"``,a1,a2,c1,c2); } |

A、2,345,1,a

B、12,345,a,b

C、2a,45b,1,3

D、2,789,1,a

答案:A

解析:getchar()接收第一个字符并赋给c1,c1=1。scanf接收下面输入的两位赋值给a1,但2a中的a不是整型,所以是无效的,故a1=2。字符'a'被下一个getchar()接收并赋给c2,c2=a。第二个scanf接收字符'a'下面输入的三位赋值给a2,故a2=345。综上,选择选项A。
8、能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是()

A、return这二个数

B、形参用数组

C、形参用二个指针

D、用二个全局变量

答案:A

解析:return只能返回一个数值,故选择选项A。
9、 对于以下代码,说法正确的是

|---|---------------------------------------|
| 1 | char * p= ``new char``[``100``] |

A、p 和 new出来的内存都在栈上

B、p 和 new出来的内存都在堆上

C、p在栈上 new出来的在堆上

D、p在堆上 new出来的在栈上

答案:C

解析:动态分配的内存在堆上,计算机自动开辟的内存在栈上,故选择选项C。
10、math.h的abs返回值()

A、不可能是负数

B、不可能是正数

C、都有可能

D、不可能是0

答案:C

解析:正常情况下,abs返回值为非负数。但是负数的范围比正数大,8位2进制为例,其范围为-128~127,所以当计算abs(-128)时,不会返回128,只会返回原值。所以选择选项C。

相关推荐
轻口味25 分钟前
命名空间与模块化概述
开发语言·前端·javascript
晓纪同学1 小时前
QT-简单视觉框架代码
开发语言·qt
威桑1 小时前
Qt SizePolicy详解:minimum 与 minimumExpanding 的区别
开发语言·qt·扩张策略
飞飞-躺着更舒服1 小时前
【QT】实现电子飞行显示器(简易版)
开发语言·qt
明月看潮生2 小时前
青少年编程与数学 02-004 Go语言Web编程 16课题、并发编程
开发语言·青少年编程·并发编程·编程与数学·goweb
明月看潮生2 小时前
青少年编程与数学 02-004 Go语言Web编程 17课题、静态文件
开发语言·青少年编程·编程与数学·goweb
Java Fans2 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手2 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
Chinese Red Guest2 小时前
python
开发语言·python·pygame
一棵星2 小时前
Java模拟Mqtt客户端连接Mqtt Broker
java·开发语言