大家好,我是安然无虞。
文章目录
每篇前言
博客主页:安然无虞
作者认证:2021年博客新星Top2
咱的口号:🌹小比特,大梦想🌹
作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请铁汁批评斧正。
火爆专栏:蓝桥杯基础算法剖析
欢迎加入:比特社区
种一棵树最好的时间是十年前,其次是现在。各位,共勉。
指针面试真题一
给你一段代码,问程序的结果是什么?
这道题很简单,我相信铁子你肯定会,先自己心想答案是啥,再看我的思路哦。知识点补充
指针类型决定了指针向前或向后走一步的步长(±整数),单位是字节。详情请看我原先的一篇文章:指针初阶详解
解题思路
指针面试真题二
已知结构体大小是20字节,问下列表达式的值分别是多少?
解题思路
指针面试真题三
在小端存储模式下,给出下面一段程序,问输出什么?
知识点补充
这里要补充大小端的概念:
大端字节序存储:当一个数据的低位放到高地址处,数据的高位放到低地址处;
小端字节序存储:
当一个数据的低位放到低地址处,数据的高位放到高地址处.
这个知识点很重要,之前也多次提到过,这里我就不再重复咯,详情请看这篇文章:【校招面经】学完C语言 · 这些高频面试考点你都掌握了吧~解题思路
这里再说一遍指针类型的意义
意义一:
指针类型决定了指针在解引用的时候一次能访问几个字节(也叫指针的权限)。
意义二:
指针类型决定了指针向前或向后走一步的步长(±整数),单位是字节!
指针面试真题四·有坑~小心
这道题不难,但是有坑哦,小心啦。
知识点补充
逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果,这里需要注意哦,每个表达式都会执行计算,只不过选用最后一个表达式的结果作为整个表达式的结果。还有很多操作符,详情请看(选看):操作符详解
解题思路
指针面试真题五
给出如下程序,问输出什么值?
知识点补充
指针-指针:
注意哦,使用指针-指针运算的时候,前提是两个指针指向的是同一块内存空间,那何为指向同一块内存空间呢?最典型的例子就是数组。指针-指针其实表示的是两个指针中间的元素个数,注意哦,不是中间有几个字节。
解题思路
指针面试真题六
很简单的一道题:
解题思路
这道题比较简单,我就不过多赘述咯。
指针面试真题七
这道题实际上是为下一题过度准备的。
解题思路
指针面试真题八
注意哦,这道题算是这几道中难度最大的一道,但是有了前一题的思路,这道题也就不再那么难以理解。
解题思路
一开始,在内存中是这么存储的:
第一个:第二个:
第三个:
第四个:
指针面试真题九
分析下面两段代码:
解题思路
首先,我们遇到这样的题目时,要学会的是断句,(也就是清楚哪两个括号相互对应),这点是非常重要的。
代码1:(*(void(*)())0)();
代码分析:代码2:
void(*signal(int,void(*)(int)))(int);
代码分析:
指针面试真题十
先声明一下,下面内容在之前一篇文章中已经写过,但是由于也属于指针紧接着块内容,很重要,如果看过了可以跳过这块哦,加上去是为了给没有看过那篇文章的老铁看的,也方便我自己以后复习。
知识点补充
首先回顾一个知识点:
传统上,数组名表示首元素的地址
有两个例外:
- sizeof(数组名):单单一个数组名放到sizeof里面,此时的数组名表示的不再是首元素的地址,而是整个数组,计算的是整个数组的大小,单位是字节(注意这个单单!);
- &数组名:取出的是整个数组的地址。
好,介绍完这个知识点,那么请看下面一系列笔试题:
一、一维数组
二、字符数组
1.题型一
注意这样的一个概念:
sizeof:
- sizeof只关注占用空间的大小;
- sizeof不关注类型;
- sizeof是操作符
strlen():
- strlen()关注的是字符串中’\0’之前字符的个数;
- strlen()只针对于字符串;
- 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*,它有两种使用方法:
一般使用:
#include<stdio.h>intmain(){char ch ='w';char* pc =&ch;*pc ='a';printf("%c\n", ch);return0;}
这种使用方法比较简单,我就不过多阐述了,看看下面这种使用方法:
#include<stdio.h>intmain(){char* p ="abcdef";printf("%s\n", p);return0;}
- 注意上面的 abcdef 是常量字符串,存储在内存的只读数据区(只读不可写)
- 特别容易让我们以为是把字符串 abcdef 放到字符指针 p 里了,其实本质上是把字符串 abcdef 首字符的地址放到 p 中
所以下面代码是有问题的:
#include<stdio.h>intmain(){char* p ="abcdef";*p ='w';//目的是将'a'改成'w'(bug)return0;}
上面的第6行代码是错误的,因为常量字符串不可以修改,所以为避免上述错误,可将第5行代码修改为:
const char* p = "abcdef";
这样的话就会避免上述错误。
面试题:
解题思路:
- str1 和 str2 是两个字符数组,数组的操作方式是将右边的常量字符串拷贝到数组的空间中,所以它们是两块空间,只是内容相同,而作为数组名,str1 和 str2 是数组首元素的地址,所以 str1 != str2
- str3 和 str4 是两个字符指针,指向的是同一个常量字符串,而常量字符串存储在单独的一个内存区域(只读数据区),当几个指针指向同一个常量字符串的时候,它们实际上会指向同一块内存
三、二维数组
遇见安然遇见你,不负代码不负卿。
多谢兄弟们
码字不易,求个三连。
版权归原作者 安然无虞 所有, 如有侵权,请联系我们删除。