暑假第十七天之每天一些题系列

暑假第十七天之每天一些题系列

一、选择题

  • 下列程序段的输出结果为
unsigned long pulArray[] = {6, 7, 8, 9, 10};
unsigned long *pulPtr;
pulPtr = pulArray;
*(pulPtr + 2) += 2;
printf("%d,%d\n", *pulPtr, *(pulPtr + 2));

A. 8,10 B. 6,8 C. 7,9 D. 6,10

答案解析:

pulPtr指向数组的首元素,*(pulPtr + 2) += 2等价于*(pulPtr + 2) = *(pulPtr + 2)+2,*(pulPtr + 2)是第三个元素,将第三个元素改为了10,故打印的为6,10。

  • switch(c) 中的 c 的数据类型可以是 char、long、float、unsigned、bool ,这种说法____
    A. 正确 B. 错误

答案解析:

float不可以,c可以是任意整形

  • 以下程序运行后,输出结果是
void main()
{
    char *szStr = "abcde";
    szStr += 2;
    printf("%lu\n",szStr);
    return;
}

A. cde B. 字符 c 的 ASCLL 码值 C. “abcde” 这个常串中字符 c 所在的地址 D. 出错

答案解析:

szStr是一个字符指针,它指向字符串首字符,szStr += 2,szStr指向第三个字符c,以无符号的long形式打印szStr,这里打印的是它的地址

  • 如下程序的输出结果是
int main()
{
    int i;
    char acNew[20] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    for(i = 0; i < 10; i++)
    {
    	acNew[i] = '0';
    }
    printf("%d\n", strlen(acNew));
    return;
}

A. 0 B. 10 C. 11 D. 不确定

答案解析:

这里需要注意字符0和数字0的区别,字符0的ascii码值为48,而ascii码值为0的就是\0,strlen在计算时,遇到它就停下来了,故打印10

  • 0x12345678 在采用 BigEndian 中内存的排列顺序是,在采用 LittleEndian 内存中的排列顺序是
    A. 12 34 56 78 B. 34 12 78 56 C. 78 56 34 12 D. 56 78 12 34

大端存储是,高位在低地址,低位在高地址;而小端存储是高位在高地址,低位在低地址

故大端存储为:12 34 56 78 ; 小端存储为:78 56 34 12。

二、填空题

  • 下列代码段打印结果是
void foo(int b[][3])
{
    ++b;
    b[1][1]=9;
}
void main()
{
    int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    foo(a);
    printf("%d",a[2][1]);
}

答案解析:

将a数组传进去,++b,b是数组名,是首元素的地址,即a[0]的地址,++b,b此时指向a[1],然后b[1][1]=9,等价于*(*(b+1)+1)=9,*(b+1)+1是指向a[2][1],将a[2][1]改为了9。

  • 下面程序运行结果是____
int x = 0, y = 0, z = 0;
z = (x == 1) && (y = 2);
printf("%d ", y);

答案解析:

&&操作符在前面的表达式为假时,就不会运算后面的表达式了,x==1为假,故y=2不进行运算了,故打印的y为0。

  • 以下代码段的结果是
int i=10;
long long t = sizeof(i++);
printf("%d", i);

答案解析:

sizeof里面的表达式不进行运算,故i还是10。

三、算法题

题目描述:

求一个有序数组中两个元素值相加为k的数字,返回这两个元素的下标。要求时间复杂度是O(n),空间复杂度O(1)

思路:

定义两个指针,一个头指针一个尾指针,计算头指针和尾指针指向内容的和,若大于k则尾指针向前移,若小于k则头指针向后移,否则就是等于,返回下标。

代码如下:

//两个数的下标结构体
typedef struct
{
    int x;
    int y;
}Array;
Array A;
void AddIsK(int* nums, int sz, int k)
{
    int begin = 0;
    int end = sz - 1;
    while (begin < end)
    {
        if (nums[begin] + nums[end] > k)
        {
            end--;
        }
        else if (nums[begin] + nums[end] < k)
        {
            begin++;
        }
        else
        {
            A.x = begin;
            A.y = end;
            break;
        }
    }

}
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    AddIsK(arr, sz, 6);
    printf("%d %d", A.x, A.y);
    return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小赵小赵福星高照~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值