> 文档中心 > 【校招面经】这10道指针面试真题,快来检测自己掌握了几道。

【校招面经】这10道指针面试真题,快来检测自己掌握了几道。

在这里插入图片描述

大家好,我是安然无虞。

文章目录

  • 每篇前言
  • 指针面试真题一
    • 知识点补充
    • 解题思路
  • 指针面试真题二
    • 解题思路
  • 指针面试真题三
    • 知识点补充
    • 解题思路
  • 指针面试真题四·有坑~小心
    • 知识点补充
    • 解题思路
  • 指针面试真题五
    • 知识点补充
    • 解题思路
  • 指针面试真题六
    • 解题思路
  • 指针面试真题七
    • 解题思路
  • 指针面试真题八
    • 解题思路
  • 指针面试真题九
    • 解题思路
  • 指针面试真题十
    • 知识点补充
  • 遇见安然遇见你,不负代码不负卿。

每篇前言


博客主页:安然无虞

作者认证:2021年博客新星Top2

咱的口号:🌹小比特,大梦想🌹

作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请铁汁批评斧正。

火爆专栏:蓝桥杯基础算法剖析
欢迎加入:比特社区
在这里插入图片描述


种一棵树最好的时间是十年前,其次是现在。各位,共勉。

指针面试真题一

给你一段代码,问程序的结果是什么?
在这里插入图片描述这道题很简单,我相信铁子你肯定会,先自己心想答案是啥,再看我的思路哦。

知识点补充

指针类型决定了指针向前或向后走一步的步长(±整数),单位是字节。详情请看我原先的一篇文章:指针初阶详解

解题思路

在这里插入图片描述


指针面试真题二

已知结构体大小是20字节,问下列表达式的值分别是多少?
在这里插入图片描述

解题思路

在这里插入图片描述


指针面试真题三

在小端存储模式下,给出下面一段程序,问输出什么?
在这里插入图片描述

知识点补充

这里要补充大小端的概念:
大端字节序存储:

当一个数据的低位放到高地址处,数据的高位放到低地址处;

小端字节序存储:

当一个数据的低位放到低地址处,数据的高位放到高地址处.
这个知识点很重要,之前也多次提到过,这里我就不再重复咯,详情请看这篇文章:【校招面经】学完C语言 · 这些高频面试考点你都掌握了吧~

解题思路

在这里插入图片描述这里再说一遍指针类型的意义
意义一:
指针类型决定了指针在解引用的时候一次能访问几个字节(也叫指针的权限)。
意义二:
指针类型决定了指针向前或向后走一步的步长(±整数),单位是字节!


指针面试真题四·有坑~小心

这道题不难,但是有坑哦,小心啦。
在这里插入图片描述

知识点补充

逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果,这里需要注意哦,每个表达式都会执行计算,只不过选用最后一个表达式的结果作为整个表达式的结果。还有很多操作符,详情请看(选看):操作符详解

解题思路

在这里插入图片描述


指针面试真题五

给出如下程序,问输出什么值?
在这里插入图片描述

知识点补充

指针-指针:
注意哦,使用指针-指针运算的时候,前提是两个指针指向的是同一块内存空间,那何为指向同一块内存空间呢?最典型的例子就是数组。

指针-指针其实表示的是两个指针中间的元素个数,注意哦,不是中间有几个字节。

解题思路

在这里插入图片描述


指针面试真题六

很简单的一道题:
在这里插入图片描述

解题思路

这道题比较简单,我就不过多赘述咯。


指针面试真题七

这道题实际上是为下一题过度准备的。
在这里插入图片描述

解题思路

在这里插入图片描述


指针面试真题八

注意哦,这道题算是这几道中难度最大的一道,但是有了前一题的思路,这道题也就不再那么难以理解。
在这里插入图片描述

解题思路

一开始,在内存中是这么存储的:
在这里插入图片描述第一个:在这里插入图片描述第二个:
在这里插入图片描述第三个:
在这里插入图片描述第四个:
在这里插入图片描述


指针面试真题九

分析下面两段代码:
在这里插入图片描述

解题思路

首先,我们遇到这样的题目时,要学会的是断句,(也就是清楚哪两个括号相互对应),这点是非常重要的。
代码1:

(* (void(*)() )0 )();

代码分析:在这里插入图片描述代码2:

void (*signal(int, void(*)(int)))(int);

代码分析:在这里插入图片描述


指针面试真题十

先声明一下,下面内容在之前一篇文章中已经写过,但是由于也属于指针紧接着块内容,很重要,如果看过了可以跳过这块哦,加上去是为了给没有看过那篇文章的老铁看的,也方便我自己以后复习。

知识点补充

首先回顾一个知识点:

传统上,数组名表示首元素的地址

有两个例外:

  1. sizeof(数组名):单单一个数组名放到sizeof里面,此时的数组名表示的不再是首元素的地址,而是整个数组,计算的是整个数组的大小,单位是字节(注意这个单单!);
  2. &数组名:取出的是整个数组的地址。

好,介绍完这个知识点,那么请看下面一系列笔试题:

一、一维数组

在这里插入图片描述


二、字符数组

1.题型一

注意这样的一个概念:

sizeof:

  1. sizeof只关注占用空间的大小;
  2. sizeof不关注类型;
  3. sizeof是操作符

strlen():

  1. strlen()关注的是字符串中’\0’之前字符的个数;
  2. strlen()只针对于字符串;
  3. strlen()是库函数

好,请看下面的代码:

代码1:

在这里插入图片描述


代码2:

在这里插入图片描述

这里再重点强调一下这行代码:

printf("%d\n", strlen(*arr));

strlen()需要的是一个地址,从这个地址开始向后找字符直到’\0’,统计的是’\0’之前字符的个数,但是*arr表示的是首元素,也就是’a’,这时传递给strlen()的就是’a’的ACSII值97,strlen()会把97作为起始地址来统计字符串,这样的话也就会形成内存访问冲突。

2.题型二

代码1:

代码2:

有了上面的经验,那么下面一定难不到你啦!

在这里插入图片描述

3.题型三

代码1:
在这里插入图片描述

代码2:

在这里插入图片描述

补充常量字符串

在指针类型中我们知道有一种指针类型是char*,它有两种使用方法:

一般使用:

#includeint main(){     char ch = 'w';     char* pc = &ch;     *pc = 'a';     printf("%c\n", ch);     return 0;}

这种使用方法比较简单,我就不过多阐述了,看看下面这种使用方法:

#includeint main(){     char* p = "abcdef";     printf("%s\n", p);     return 0;}
  1. 注意上面的 abcdef 是常量字符串,存储在内存的只读数据区(只读不可写)

  2. 特别容易让我们以为是把字符串 abcdef 放到字符指针 p 里了,其实本质上是把字符串 abcdef 首字符的地址放到 p 中

所以下面代码是有问题的:

#includeint main(){     char* p = "abcdef";     *p = 'w';//目的是将'a'改成'w'(bug)     return 0;}

上面的第6行代码是错误的,因为常量字符串不可以修改,所以为避免上述错误,可将第5行代码修改为:

const char* p = "abcdef";

这样的话就会避免上述错误。


面试题:

在这里插入图片描述

在这里插入图片描述解题思路:

  1. str1 和 str2 是两个字符数组,数组的操作方式是将右边的常量字符串拷贝到数组的空间中,所以它们是两块空间,只是内容相同,而作为数组名,str1 和 str2 是数组首元素的地址,所以 str1 != str2
  2. str3 和 str4 是两个字符指针,指向的是同一个常量字符串,而常量字符串存储在单独的一个内存区域(只读数据区),当几个指针指向同一个常量字符串的时候,它们实际上会指向同一块内存

在这里插入图片描述


三、二维数组
在这里插入图片描述


在这里插入图片描述

遇见安然遇见你,不负代码不负卿。

多谢兄弟们 码字不易,求个三连。

在这里插入图片描述