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

本文通过一系列选择题、填空题和算法题,深入探讨了C/C++编程中的指针、数组及链表操作。内容包括指针与数组的关系、指针在函数调用中的传递、字符串拷贝、内存存储形式以及链表节点查找等核心概念。这些题目旨在帮助读者巩固指针基础知识,理解指针在实际编程中的应用。
摘要由CSDN通过智能技术生成

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

一、选择题

  • 如下程序:

    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步,然后再一起走,我们看下面的动图:

链表oj2

当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;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小赵小赵福星高照~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值