暑假第九天之每天一些题系列
Posted 小赵小赵福星高照~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暑假第九天之每天一些题系列相关的知识,希望对你有一定的参考价值。
暑假第九天之每天一些题系列
一、选择题
-
下面程序的输出结果为多少(32位机器上)
void Func(char str_arg[2]) { int m = sizeof(str_arg); int n = strlen(str_arg); printf("%d\\n", m); printf("%d\\n", n); } int main(void) { char str[] = "Hello"; Func(str); }
A. 5 5 B. 5 4 C. 4 5 D. 4 4
答案解析:
str是一个字符数组,将数组名传参传给Func,数组名是数组首元素地址将H的地址传过去,传地址就需要用指针来接收,其实函数参数本质上是个指针,大小为4或者8,则sizeof(str_arg)为4,strlen函数计算字符串长度时看的是\\0,我们遇到\\0会是在5个字符后,故strlen(srt_arg)为5
- 1<<3+2 的值是____
A. 32 B. 10 C. 16 D. 6
答案解析:
<<是左移操作符,1的二进制为:
00000000000000000000000000000001
加号的优先级高于左移操作符:故
1左移五位后(左边删除五位,右边补五个0):
00000000000000000000000000100000
-
在小端序的机器中,如果
union X { int x; char y[4]; }a; a.x=0x11223344;//16进制
则
A. a.y[0]=0x11 B. a.y[1]=0x11 C. a.y[2]=0x11
D. a.y[3]=0x11 E. a.y[0]=0x22 F. a.y[3]=0x22
答案解析:
X是一个联合体,特点是里面的成员共用一块空间,因为是小端序的机器,a.x在内存中的存储为:44 33 22 11,
因为y数组和x共用一块内存空间,则y[0]=44,y[1]=33,y[2]=22,y[3]=11,故答案为:D
-
阅读如下代码,请问: p 和 “hello,world” 存储在内存哪个区域____
#include <stdio.hs> int main() { const char *p = "hello,world"; return 0; }
A. 栈,堆 B. 栈,栈 C. 堆,只读存储区 D. 栈,只读存储区
答案解析:
p是一个局部变量,存储在栈区,而常量字符串存储在只读存储区
- 空指针是指
A. 所指向的空间位置未存放任何数据的指针
B. 所指向的空间位置存放着数据0的指针
C. 所指向的空间位置可用于存放任何类型数据的指针
D. 所指向的空间位置就是地址0的指针
答案解析:
空指针是一个特殊的指针值。空指针是指可以确保没有指向任何一个对象的指针。通常使用宏定义NULL来表示空指针常量值。NULL就代表系统的0地址单元,空指针确保它和任何非空指针进行比较都不会相等,因此经常作为函数发生异常时的返回值使用。
二、填空题
-
如下代码结果是多少 a=, x=
int main() { int a,x; for(a = 0,x = 0; a<=1 && !x++; a++) { a++; } printf("%d %d",a,x); return 0; }
答案解析:
++的优先级高于!,是后置++,故是先使用后++,!x++表达式的值为1,x变为1,进入循环,两次a++,a不符合循环进行的条件,退出循环,则此时a=2,x=1
- 写一个宏,输入两个参数,返回较小的一个:_________
答案解析:
#define Min(X,Y) X<Y?X:Y int main() { int a=10; int b=20; printf("%d\\n",Min(a,b)); }
使用三目操作符
-
下面程序输出什么
#include <stdio.h> int main() { int a[5] = {1, 2, 3, 4, 5}; int* p1 = (int*)(&a + 1); int* p2 = (int*)((int)a + 1); int* p3 = (int*)(a + 1); printf("%d, %x, %d\\n", p1[-1], p2[0], p3[1]); return 0; }
答案解析:
&数组名是整个数组的地址,+1跳过整个数组,指向数组的最后一个元素的下一个位置,即p1指向这里,将a强制类型转化为int类型,则它+1只能跳过四个字节,即一个数组元素,即p2指向数组的第二个元素2,数组名为首元素的地址,+1指向第二个元素,即p3指向这里;p1[-1]等价于:*(p1-1),p1-1指向5的地址;p2[0]等价于:*p2,p2指向2的地址,因为以十六进制打印,故打印的应为:02000000,打印会将2前面的0省略掉;p3[1]等价于:*(p3+1),p3指向2的地址,+1指向3的地址,则最后打印分别为5,2000000,3。
三、算法题
题目描述:
输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18
思路:
我们定义一个当前和变量和最大和变量,最开始都初始化为0,当我们给当前和变量加上一个正数的时,和为增加,当我们加上一个负数的时候,和会减少,如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。如果当前得到的和是一个正数,则让他和之前保存的最大和比较,若大于最大和,则更新最大和变量。对于全都为负数的情况,那么子数组和最大就为数组中最大的那个元素
代码如下:
#include<stdio.h>
void Find(int* nums, int sz)
{
int i = 0;
int nsumcur = 0;
int greatnsum = 0;
for (i = 0; i < sz; i++)
{
nsumcur += nums[i];//当我们加上一个正数的时,和为增加,当我们加上一个负数的时候,和会减少,如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。
if (nsumcur < 0)
{
nsumcur = 0;
}
if (nsumcur > greatnsum)//当前和大于之前保存的最大和时,更新最大和
{
greatnsum = nsumcur;
}
}
//全都为负数的情况,那么子数组和最大就为数组中最大的那个元素
if (greatnsum == 0)
{
greatnsum = nums[0];
for (i = 0; i < sz; i++)
{
if (greatnsum < nums[i])
{
greatnsum = nums[i];
}
}
}
printf("%d\\n", greatnsum);
}
int main()
{
int arr[] = { 1,-2,3,10,-4,7,2,-5 };
int sz = sizeof(arr) / sizeof(arr[0]);
Find(arr, sz);
return 0;
}
以上是关于暑假第九天之每天一些题系列的主要内容,如果未能解决你的问题,请参考以下文章