牛客刷题——part3

86 篇文章 0 订阅

牛客刷题

  1. 以下程序的输出结果是? (B)
#include <stdio.h> main()
{
char a[10]={ '1','2','3','4','5','6','7','8','9',0},*p; int i;
i=8;
p=a+i;
printf("%s\n",p-3);
}

A 6
B 6789
C ‘6’
D 789

根据题目a是数组名也是首元素地址,这里p=a+i也就是让a向后偏移8个char类型空间,指向字符9的位置,打印结果是从p-3开始打印也就是从6开始打印。使用的是%s进行格式化打印,遇到\0会结束,因此会打印出6789,选择B

  1. 以下程序的输出结果是:(D)
#include <iostream.h>
void main() {
int x=3,y=3;
switch(x%2) {
case 1:
switch (y) {
case 0:cout<<"first";
case 1:cout<<"second";break;
default: cout<<"hello";
}
case 2:cout<<"third";
}
}

A second third
B hello
C first second
D hellothird

根据题意往下走即可,这里的switch判断语句中是x%2也就是1,于是直接进入case1语句中,这里需要注意的是这里case1后面没有break。case1语句中嵌套了第二个switch语句,判断条件是y也就是3,没有case情况符合,于是执行default语句:打印hello。执行完该语句后跳出switch语句。然后执行第一个switch语句的case2,也就是打印third。因此最终打印内容是hellothird,选择D

  1. 以下能对二维数组a进行正确初始化的语句是(B)
    A int ta[2][]={{0,1,2},{3,4,5}};
    B int ta[][3]={{0,1,2},{3,4,5}};
    C int ta[2][4]={{0,1,2},{3,4},{5}};
    D int ta[][3]={{0,2},{},{3,4,5}};

二维数组在定义或者初始化的时候,只能省略行,列不能进行省略,因此A错误。里面的{}中是每一行的初始化数据,有几个{}就有几行,C中有3个{}比定义的多了,因此错误。D中只能连续初始化,不能出现间隔因此D错误。选择B

  1. 能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是(A)
    A return这二个数
    B 形参用数组
    C 形参用二个指针
    D 用二个全局变量

A:return每次只能return一个数据类型,除非放在一个容器里面,因此选A

  1. int *p[4] 与选择项中的 说明 (C) 等价
    A int p[4]
    B int *p
    C int *(p[4])
    D int (*p)[4]

这里题目中[]优先级高于*,因此int *p[4]是一个int类型的数组,数组元素个数为4
A:p是一个int类型的数组,数组元素个数为4
B:p是一个int类型的指针
C:p是一个int
类型的数组,数组元素个数为4
D:这里p先和*结合,因此p是一个int类型的数组指针,数组元素个数为4

  1. 设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是(D)
    A n=0;while(ch=getchar()!=‘\n’)n++;
    B n=0;while(getchar()!=‘\n’)n++;
    C for(n=0;getchar()!=‘\n’;n++);
    D n=0;for(ch=getchar();ch!=‘\n’;n++);

根据题目需要统计字符个数,遇到回车停止。
D中for的初始化语句只会执行一次,也就是只会getchar一次,只会获取一次字符,因此D没法统计字符个数

  1. 以下代码
char *ptr;
char myString[] = "abcdefg";
ptr = myString;
ptr += 5;

代码执行之后ptr指向的内容是?(B)
A Compiler error
B f
C efg
D defg

题目中定义了一个char类型的指针ptr,并让他指向myString的首元素,ptr+=5后也就是向后偏移了5个char类型空间,也就是指向了f字符所在位置,因此选B

  1. 下面3段程序代码的效果一样吗?©
int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;

A (2)=(3)
B (1)=(3)
C (1)=(2)
D 都不一样
E 都一样

题目中这三段代码的区别就是const和*位置的区别,也就是常量指针和指针常量的区分。
常量指针就是所指空间的值是一个常量,不能改变该位置的值的大小
指针常量是该指针的指向不能发生改变,但是可以改变指针所指空间的值。
判断依据为const和*的相对位置:如果const在*左边则是常量指针,否则就是指针常量,
因此这里1和2都是常量指针,3是指针常量,因此选C

  1. 32位系统中,定义**a[3][4],则变量占用内存空间为(B)。
    A 4
    B 48
    C 192
    D 12

由于[]运算符优先级高于*因此这是一个3行4列的数组,其中存放的类型是指针类型,在32位系统中,指针大小为4个字节,因此4*3*4=48,选择B

  1. 假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?(B)
#include <stdio.h>
int main(){
long long a = 1, b = 2, c = 3;
printf("%d %d %d\n", a, b, c);
return 0;
}

A 1,2,3
B 1,0,2
C 1,3,2
D 3,2,1

以1为例:
大端:低位存高地址
00 00 00 01
小端:低位存低地址
01 00 00 00
题目中long long 类型占8个字节,并且是小端情况
a:01 00 00 00 00 00 00 00
b:02 00 00 00 00 00 00 00
c:03 00 00 00 00 00 00 00
使用printf格式化打印使用的是%d形式占4个字节,这里函数调用栈是从高地址向低地址增长的,a,b,c的入栈顺序为c,b,a,因此栈中,数据存放顺序从高地址到低地址存放形式为:
01 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 03 00 00 00 00 00 00 00
低 高
出栈顺序为从低地址先出,每次取4个字节空间,也就是1,0 ,2选择B

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值