暑假第五天之每天一些题系列

Posted 小赵小赵福星高照~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了暑假第五天之每天一些题系列相关的知识,希望对你有一定的参考价值。

暑假第五天之每天一些题系列

一、选择题

  • 如下程序:

    int a[10];
    int*pa;
    pa = a;
    

    则元素a[1]的地址可以表示为
    A. pa+1 B. pa+2 C. pa+4 D. a+2

答案解析:

数字名a是首元素的地址,pa存放的是首元素的地址,pa+1是第二个元素的地址,即a[1]的地址可以表示为pa+1

  • 如下程序结果运行结果是

    int Change(int *pX)
    {
        int y = 8;
        y = y - *pX;
        pX = &y;
    	return 0;
    }
    int main()
    {
        int xx = 3;
        int *pY = &xx;
        Change(pY);
        printf("%d\\n", *pY);
        return 0;
    }
    

    A. 8 B. 3 C. 5 D. 不确定

答案解析:

指针pY指向xx,将pY的值传给Change,需要注意的是值传递没办法改变外面的值的,故*pY为3

  • 下列程序执行后的输出结果是

    int main()
    {
        char arr[2][4];
        strcpy((char*)arr,"you");
        strcpy(arr[1],"me");
        arr[0][3] = '&';
        printf("%s\\n",arr);
        return 0;
    }
    

    A. you&me B. you C. me D. err

答案解析:

arr是二维数组数组名,数组名是首元素地址首元素是arr[0],所以arr是arr[0]的地址,将"you"拷贝到arr[0]中,然后将me拷贝到arr[1]中,最后将’&'赋给了arr[0][3],刚好在you后面,故打印的arr为you&me

  • -27 在内存中的存储形式是以下哪一种
    A. 0001 1011 B. 1110 0100 C. 1110 0101 D. 1010 0111

答案解析:

原码:10011011

反码:11100100

补码:11100101

内存中存储的是补码

  • 若有以下定义和语句,则选项中错误的语句是

    int a = 4,b = 3,*p,*q,*w;
    p = &a;
    q = &b;
    w = q;
    q = NULL;
    

    A. *q = 0 B. w = p C. *p = a D. *p = *w

答案解析:

q最后赋为NULL了,不能对NULL指针解引用

二、填空题

  • 如下代码结果是多少

    int fun(int x)
    {
        int count = 0;
        while(x)
        {
            count++;
            x = x & (x-1);
        }
        return count;
    }
    int main()
    {
        printf("fun(2019)=%d\\n",fun(2019));
    }
    

答案解析:

该fun函数的功能是求x的二进制有多少个1,x=x&(x-1)是将x的二进制中从右到左第一个1去掉,功能就是统计x的二进制有多少个1,2019的二进制有8个1,故最后输出结果为8

  • 以下程序的输出结果为

    #define CIR(r) r*r
    void main()
    {
        int a = 1;
        int b = 2;
        int t;
        t = CIR(a + b);
        printf("%d/n", t);
        return;
    }
    

答案解析:

CIR(a + b)在预处理阶段完成替换,替换为a + b*a + b,代入值得t=5

  • 下面的代码中,函数Test执行完毕后,打印的结果是

    unsigned long g_ulGlobal = 0;
    void GlobalInit(unsigned long ulArg)
    {
        ulArg = 0x01;
        return;
    }
    void Test()
    {
        GlobalInit(g_ulGlobal);
        printf("%lu", g_ulGlobal);
        return;
    }
    

答案解析:

g_ulGlobal是个全局变量,初始化为0,GlobalInit为传值调用,是不能改变实参的,故打印的是0

三、算法题

题目描述:

有一张单链表,编写函数求倒数第K个结点。

思路:

我们先定义两个指针slow,fast,fast先走k步,然后再一起走,我们看下面的动图:

当fast为NULL时,此时的slow就为倒数第k个结点

需要注意的是:输入的k如果大于结点的个数,fast还没走完k步就变为NULL了,这里要特别返回NULL

代码如下:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) 
{
    struct ListNode* slow=pListHead;
    struct ListNode* fast=pListHead;
    if(k==0)
    {
        return NULL;
    }
    while(k--)
    {
        if(fast==NULL)//k大于链表长度时,k没减完fast就走到NULL
        {
            return NULL;
        }
       	fast=fast->next;
    }
    while(fast)
    {
        slow=slow->next;
        fast=fast->next;
    }
    return slow;
}

以上是关于暑假第五天之每天一些题系列的主要内容,如果未能解决你的问题,请参考以下文章

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

暑假第四天之每天一些题系列

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

暑假第二天之每天一些题系列

暑假第九天之每天一些题系列

暑假第三天之每天一些题系列