• C语言指针详解(4)———找工作必看指针笔试题汇总


    指针对于编程工作的重要性

    C语言指针在找工作中具有重要性。以下是几个原因:

    1.高效的内存管理:C语言指针可以帮助程序员高效地管理内存,包括动态内存分配和释放,以及数据的访问和操作。这对于开发性能优化的应用程序非常重要,如嵌入式系统、图形处理等领域。

    2.与底层系统交互:C语言常用于与底层系统、硬件和操作系统进行交互。指针在这些场景中扮演重要角色,如访问硬件寄存器、操作设备驱动程序、进行系统级编程等。

    3.数据结构和算法:指针是实现复杂数据结构和算法的基础,如链表、堆栈、队列、树等。这些数据结构和算法在面试和工作项目中经常使用,对理解和应用指针至关重要。

    4.代码优化和调试:指针的使用可以优化代码的执行效率,并帮助调试程序。程序员需要熟练掌握指针的概念和技巧,以有效地优化代码和解决程序错误。

    5.C语言编程面试:在找工作过程中,很多公司会进行C语言编程面试,测试候选人对C语言的理解和应用能力。指针是C语言中的重要概念,面试官通常会提问关于指针的问题,如指针运算、指针和数组之间的关系等。

    题目1

    printf输出什么?

    int main()
    {
    	int aa[2][5] = { 10,9,8,7,6,5,4,3,2,1 };
    	int* ptr1 = (int*)(&aa + 1);//第二行1后面的地址,&aa+1相当于跳过了整个数组
    	int* ptr2 = (int*)(*(aa + 1));//第二行起始地址,即5
    	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));//ptr1-1,即从1后面的地址变为1,ptr2-1,即从5减到上一行的6
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    解析:输出1和6
    如图所示
    在这里插入图片描述

    题目2

    printf输出什么?

    int main()
    {
    	int a[5] = { 5, 4, 3, 2, 1 };
    	int* ptr = (int*)(&a + 1);
    	printf("%d,%d", *(a + 1), *(ptr - 1));
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    解析:输出4和1
    如图所示
    在这里插入图片描述

    题目3

    假设p 的值为0x100000。 如下表表达式的值分别为多少?
    已知,结构体Test类型的变量大小是20个字节

    struct Test
    {
    	int Num;
    	char* pcName;
    	short sDate;
    	char cha[2];
    	short sBa[4];
    }*p;
    
    
    int main()
    {
    	printf("%p\n", p + 0x1);
    	printf("%p\n", (unsigned long)p + 0x1);
    	printf("%p\n", (unsigned int*)p + 0x1);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    解析:0x100014,0x100001,0x100004

    %p是打印地址,假设p=(struct Test*)的地址为0x100000

    printf(“%p\n”, p +0x1);

    p+0x1就相当于p+1,结构体指针+1,跳过一个结构体的大小,即跳过20个字节0x100000是一个16进制的,所以+20后变为0x100014

    printf(“%p\n”, (unsigned long)p +0x1);

    强制变换为无符号整形,整数+1就是+1,即+1后变为0x100001

    printf(“%p\n”, (unsigned int*)p + 0x1);

    强制转换为无符号指针整形,指针+1即跳过四个字节,即变为0x100004

    题目4

    printf输出什么?

    int main()
    {
    	int a[4] = { 1, 2, 3, 4 };
    	int* ptr1 = (int*)(&a + 1);//跳过整个数组,在4后面
    	int* ptr2 = (int*)((int)a + 1);
    	printf("%x,%x", ptr1[-1], *ptr2);//ptr1[-1]相当于*(ptr1-1),为4
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    解析:4,20000000
    如图所示
    在这里插入图片描述
    在这里插入图片描述

    题目5

    printf输出什么?

    #include 
    int main()
    {
    	int a[3][2] = { (0, 1), (2, 3), (4, 5) };
    	int* p;
    	p = a[0];
    	printf("%d", p[0]);//1
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    解析:1

    int a[3][2] = { (0, 1), (2, 3), (4, 5) };

    注意这里是()不是{},是一个逗号表达式,是个坑,此数组应为{1,3,5,0,0,0}
    数组应该为如下这样

    1 3
    5 0
    0 0

    最后输出结果为1.

    题目6

    printf输出什么?

    int main()
    {
    	int a[5][5];
    	int(*p)[4];//数组指针
    	p = a;//类型有些不合适
    	//a--int (*)[5]
    	//p--int (*)[4]
    	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    解析:FFFFFFFC,-4

    p = a;这句代码有点问题,类型有些不合适 ,原因如下:

    a–int (※)[5] p–int (※)[4]

    更详细解析见下图所示

    在这里插入图片描述

    题目7

    printf输出什么?

    #include 
    int main()
    {
    	char* a[] = { "work","at","alibaba" };//work\0   at\0   alibaba\0
    	char** pa = a;//pa的类型是char**,是一个二级指针
    	pa++;
    	printf("%s\n", *pa);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    解析:at
    如下图
    在这里插入图片描述

    总结

    总的来说,熟练掌握C语言指针的概念和使用方法对于找工作非常重要。它可以帮助你在编程面试中表现出良好的技术能力,并在实际工作中高效地处理内存和数据结构。

  • 相关阅读:
    Scala008--Scala中的数据结构【集合】
    自动推送消息时附带图片的一种实现方式
    VictoriaLogs:一款超低占用的 ElasticSearch 替代方案
    华为云云耀云服务器L实例评测|怎么搭建企业综合Web平台
    uname
    [python学习]--使用相对路径导入包
    信号(1.信号概念 2.信号的处理方式 3.信号阶段 用户态,内核态)
    Nginx (6):nginx防盗链配置
    C++ vector使用方法
    C++ - 8月31日 - 约瑟夫环问题
  • 原文地址:https://blog.csdn.net/qq_57425280/article/details/132914948