牛客刷题
- 以下程序的输出结果是? (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
- 以下程序的输出结果是:(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
- 以下能对二维数组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
- 能把函数处理结果的二个数据返回给主调函数,在下面的方法中不正确的是(A)
A return这二个数
B 形参用数组
C 形参用二个指针
D 用二个全局变量
A:return每次只能return一个数据类型,除非放在一个容器里面,因此选A
- 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
- 设变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是(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没法统计字符个数
- 以下代码
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
- 下面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
- 32位系统中,定义**a[3][4],则变量占用内存空间为(B)。
A 4
B 48
C 192
D 12
由于[]运算符优先级高于*因此这是一个3行4列的数组,其中存放的类型是指针类型,在32位系统中,指针大小为4个字节,因此4*3*4=48,选择B
- 假设在一个 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