嵌入式全栈开发学习笔记---C语言笔试复习大全15

目录

指针运算

笔试题17

思考:++*px、*px++和(*px)++的区别!

笔试题18

补充命令8:“cd ..”退回到上一级目录

补充命令9:“man 3 函数名”可以查看库函数的原型

const 修饰指针是什么意思?(笔试重点)

空指针和野指针

指针的初始化

补充:调试段错误

补充命令10:”gcc 文件名.c -o文件名 -g”回车”gdb 文件名”回车”run”回车查看段错误


上一篇复习了指针的定义相关内容,这一篇我们继续来复习指针使用时的注意事项

说明:我们学过单片机的一般都是有C语言基础的了,网上关于C语言的资料有很多,大家如果对C语言不熟悉的话可以先去详细学一下,再以这篇博文作为复习资料学习。

这篇博文的目的是复习C语言,我们会陆续以30多个编程题作为复习要点,这30多个编程题基本涵盖了C语言所有的内容了,只要你掌握了这30多个编程题,那么你的C语言基本就没什么问题了。

注意:由于本专栏是嵌入式全栈开发专栏,为了我们能熟悉以后实际工作中的开发环境,我们写C语言全部在Linux中的vim编辑器中写,这么做事为了我们能够熟练掌握Linux系统的常用命令以及Linux上的vim编辑器的常用工作命令,以达到对口训练的目的!

vim编辑器的一些工作命令在上一篇博文中已经详细介绍过了,如果不了解可以先去看看。

我们正式开始:

指针运算

指针可以赋值运算

比如定义一个int型的变量a、int*型的pa、in*型的pb:

int a, *pa = &a, *pb ;  pb = pa;//pa指向a,pa赋值给pb,则pb也指向a

注意:以上就是一种连续定义变量和指针的一种形式,记住连续定义指针时,每一个指针变量前面都不能漏掉“*”号。连续定义指针的方式如:int* p1, *p2,不可以写成int* p1, p2,如果这样赋值的话p2就是一个int型,而不是int*型

笔试题17

问:y最终等于多少?

int x=3, y=0 , *px = &x;   

y = *px +5;                       

y = ++*px;                                                              

y = *px++;

答案是:y最终等于4

解析:

int x=3, y=0 , *px = &x; //px指向x  

y = *px +5; //等价于x+5,y=8                      

y = ++*px; //等价于x+1=4,y=4                                                             

y = *px++; //等价于y=x, x+1,即y等于4, x=4+1=5

思考:++*px、*px++和(*px)++的区别!

(1)++*px是*px先加1(也就是x先加1)再赋值;

(2)*px++是*px先赋值(也就是x先赋值),然后px加1,px加1就相等于是x的地址在加1,px加1的话就跳过4个字节,指向x空间的外面了;

(3)(*px)++是*px先赋值(也就是x先赋值),然后*px加1(也就是x加1)。

区分这些有什么用呢?我们现在来感受一下它们的作用......

笔试的时候特别喜欢考让我们写代码实现我前面讲过的一些字符串处理函数。

我们就做一道笔试题:

笔试题18

实现库函数:strcpy

strcpy函数的原型如下:

char *mystrcpy(char *dest, const char *src)

{

}

注:strcpy我的前几篇博文中也讲过这个函数是字符处理函数,它的参数是指针函数(后面会具体复习,先不管),它的作用就是将后一个参数的内容拷贝到前一个参数中,也就是将src中的内容拷贝到dest中。

我们有两种写法:

一种是先判断再赋值,

参考代码:

#include <stdio.h>void mystrcpy(char*dest,char* src)
{while(*src!='\0'){   *dest=*src;dest++;src++;}   *dest='\0';
}int main()
{char s1[]="helloworld";char s2[]="helloworld12345";mystrcpy(s2,s1);printf("%s\n",s2);return 0;
}

运行结果:

c98d9011ffe2449bb3dc68727df7282c.png

一种是先赋值再判断:

参考代码:

#include <stdio.h>void mystrcpy(char*dest,char* src)
{while((*dest++ =*src++)!='\0');
}int main()
{char s1[]="helloworld";char s2[]="helloworld12345";mystrcpy(s2,s1);printf("%s\n",s2);return 0;
}

运行结果:

3c3e486531f74730bf2656104f02065f.png

注:传数组的时候有两种写法:

比如

一种是void mystrcpy(char s1[ ])

一种是void mystrcpy(char *s1)

以上这道笔试题最好是记下来,因为它比较经典。

补充命令8:“cd ..”退回到上一级目录

补充命令9:“man 3 函数名”可以查看库函数的原型

比如要查看strcpy的函数原型,可以输入:man 3 strcpy

7fe4194f649242e49d58da62ba0e1cb3.png

回车可以看到函数原型

3f78b8525af34f41aec8cad1b06d0fb4.png

注:想要退出查看函数的界面可以直接按Q

我们看到strcpy的原型,它的参数加了一个const,它的作用是防止我们传过来的s1这个字符数组在函数体中被修改。

这个const一旦加上,那*src就不能被修改了,但是src是可以修改的,因为const修饰的是*src。

f2b9aaecd75843259b30d5ecaaebb15a.png

现在我们来具体分析这个问题:

const 修饰指针是什么意思?(笔试重点)

const有“就近原则”,也就是靠谁近就是修饰谁;

const char *s1;//修饰*s1的“*”号,那么*s1就不能被修改(即s1指向的内容不能被修改),而这种情况下,s1可以被修改的,比如s1++可以运行,(*s1)++就不能运行

char *const s1;//修饰s1,那么s1就不能被修改,s1++不可以运行,而(*s1)++可以运行

const char *const s1;//“*”号被修饰,s1也const修饰了,因此,s1++和(*s1)++都不能运行

空指针和野指针

1、定义指针的时候,养成初始化的习惯。

比如char *s = NULL; //NULL是空指针,其实就是0,这种指针也不能用

既然空指针不能用,那为什么我们有时候写代码也会定义空指针呢?是因为我们有时候要做判断,比如int *p=NULL; *P=100;  if(P!=NULL) 或者if (p==NULL)。

虽然空指针不能用,但是它至少比野指针可控,我们知道它里面是什么东西。而野指针我们不知道它里面是什么东西,野指针所指向的区域到底存不存在我们不知道,指向的区域里面的内容是什么我们也不知道。

2、如果定义指针没有初始化,则变成野指针。

int *p; //如果p是局部变量,则为垃圾值,称为野指针

*p = 100; //访问不能访问的内存(野地址),程序奔溃

注:我们也不能自己去指针的内存地址, 否则它也是野指针,比如int *p=(int*)0x10000; *p=100;像这种写法,也是野指针。

3、正确的使用指针的步骤:

a、定义指针;

b、初始化指针;

c、使用指针。

指针的初始化

1.初始化为已知变量的地址。

int a;

int *p = &a;

2.初始化为字符串常量的地址;

char *s = “helloworld”; //把字符串的地址赋值给指针变量

3.malloc动态申请内存

malloc这个函数可以用来申请堆内存,返回的是一个void*型的地址,我们可以自己强制类型转换成(char*)型的地址 (char *) malloc (),还可以强制类型转换成别的类型。

比如:

char *s = (char *) malloc (sizeof(char) * 128);

注意:申请的内存使用完后要释放掉,否则申请的越来越多就会占据很多内存。

free(s);//释放s指向的那块内存,即释放的是malloc申请的那块内存

补充:调试段错误

如果程序出现“段错误”可以在附近的每一行代码随便打印个什么东西来进行调试,如果运行后某一行的printf没有被打印出来,则问题就可以出现在这行的前面。

比如:

366d3496ca294ceeb064ba18200e5d8e.png

运行

9431599501dd4f45bbd2edefa7b4f9d3.png

说明段错误就在这附近

ad55c601dc1a4a7eaa4c32e0b286c127.png

或者我们还可以用指令来查看:

补充命令10:gcc 文件名.c -o文件名 -g回车gdb 文件名回车run回车查看段错误

即编译的时候在后面加上-g,然后回车输入”gdb 文件名”回车,然后我们在输入”run”就是让运行起来,再回车,这样我们就能看到编译器给我们报的段错误出现在哪里了。

比如:

9ca137453a404fd9ba6ebf9730bfe661.png

运行

56b175f914694474bb88800bc6f5dabb.png

查看

cc55b0bad32b4d4c89f6733419cb342f.png

以上就是这篇内容,如想了解更多,欢迎订阅本专栏!

如有问题可评论区或者私信留言,如果想要进交流群请私信!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++入门指南(上)

目录 ​编辑 一、祖师爷画像 二、什么是C 三、C发展史 四、C在工作领域的应用 1. 操作系统以及大型系统软件开发 2. 服务器端开发 3. 游戏开发 4. 嵌入式和物联网领域 5. 数字图像处理 6. 人工智能 7. 分布式应用 五、如何快速上手C 一、祖师爷画像 本贾尼斯特劳斯…

第二届“盘古石杯”全国电子数据取证大赛wp

服务器取证 先对网站进行重构 [rootstudy ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 643626ab3d8b mattermost/mattermost-pre…

Linux部署

先把需要的东西准备好&#xff1a; 第一步解压tomcat&#xff1a; tar -zxvf apache-tomcat-8.5.20.tar.gz 第二步解压jdk: tar -zxvf jdk-8u151-linux-x64.tar.gz 第三步配置Java环境变量&#xff1a; vim /etc/profile 把下面代码放进去&#xff1a; export JAVA_HOME/root…

dell服务器安装ubuntu18.04桌面版教程

目录 一、制作U盘启动盘 1.镜像下载地址&#xff1a; 2.制作U盘启动盘 二、服务器进入bios一系列设置 1.插入U盘启动盘 2.开机过程按F11键&#xff0c;进入Boot Manager &#xff0c;点击 3.点击点击One-shot BIOS Boot Menu 4.进入boot menu ,找到U盘&#xff08;一般…

react18【系列实用教程】useContext —— Context 机制实现越层组件传值 (2024最新版)

什么是 Context 机制&#xff1f; Context 机制是 react 实现外层组件向内层组件传值的一种方案&#xff0c;父组件可以向其内部的任一组件传值&#xff0c;无论是子组件还是孙组件或更深层次的组件。 实现步骤 1.使用createContext方法创建一个上下文对象 Ctx 2.在顶层组件中通…

云南区块链商户平台:抓包技术自制开票工具(三)

前言 上节我们将登录的流程梳理完毕了&#xff0c;来到了本章重点&#xff0c;既然开发票就肯定要有以下参数&#xff1a; 原工具不支持识别历史记录&#xff0c;对于我们的小商店来说&#xff0c;开票的公司基本就是固定的几个&#xff0c;如果提供下拉支持选择将会大大降低…

【机器学习】 技术栈和开发环境搭建

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 博客目录 技术栈编程语言库框架编辑器项目IDE …

linux下的进程通信

进程通信 进程为什么需要通信呢&#xff1f;进程通信的技术背景进程通信本质 进程通信分类管道匿名管道pipe匿名管道原理管道特点 命名管道创建命名管道命名管道原理 System V IPC管道与 System V的区别共享内存函数ftok()shmget() shmat()shmdt()shmctl()删除共享内存System V…

探索数据结构(让数据结构不再成为幻想)

目录 什么是数据结构 数据与结构 什么是算法 复杂度分析 时间复杂度与空间复杂度 时间复杂度 思考&#xff1a; 空间复杂度 常数阶O(1) 对数阶O(logn) 线性阶O(n) 以下为空间复杂度为O(n) 线性对数阶O(nlogn) 平方阶O(n) 指数阶O(2^n) 什么是数据结构 数据结构…

WHAT - CSS Animationtion 动画系列(二)

目录 一、循环波浪二、关键帧呼应三、关键帧顺接四、利用 transform-origin 做拉伸五、大元素可拆分多个小元素联动六、预留视觉缓冲七、随机感&#xff1a;动画周期设置八、抛物线&#xff1a;两个内外div实现x和y向量运动 今天我们主要学习动画实现要素。 一、循环波浪 利用…

类加载机制(双亲委派机制)

文章目录 JVM的作用是什么双亲委派机制加载流程 JVM的作用是什么 我们运行Java程序时&#xff0c;要安装JDK&#xff0c;JDK包含JVM&#xff0c;不同环境的JDK都是不同的。 Java 代码在编译后会形成 class 的字节码文件&#xff0c;该字节码文件通过 JVM 解释器&#xff0c;生…

音视频-H264编码封装- MP4格式转Annex B格式

目录 1&#xff1a;H264语法结构回顾 2&#xff1a;H264编码补充介绍 3&#xff1a;MP4模式转Annex B模式输出到文件示例 1&#xff1a;H264语法结构回顾 在之前文章里介绍过H264的语法结构。 传送门: 视音频-H264 编码NALU语法结构简介 2&#xff1a;H264编码补充介绍 H…

泽众财务RPA机器人常见五个应用场景

泽众RPA&#xff08;即机器人流程自动化&#xff0c;Robotic Process Automation, RPA&#xff09;解决方案是依托于各类先进信息技术手段的虚拟劳动力 &#xff08;数字劳动力&#xff09;&#xff0c;根据预先设定的程序操作指令对任务进行自动化处理&#xff0c;实现业务流程…

网络安全等级保护的发展历程

1994年国务院147号令第一次提出&#xff0c;计算机信息系统实行安全等级保护&#xff0c;这也预示着等保的起步。 2007年《信息安全等级保护管理办法》的发布之后。是等保在各行业深耕落地的时代。 2.0是等保版本的俗称&#xff0c;不是等级。等保共分为五级&#xff0c;二级…

JeeSite V5.7.0 发布,Java快速开发平台,Vite5、多项重构重磅升级

JeeSite V5.7.0 发布&#xff0c;Java快速开发平台&#xff0c;Vite5、多项重构重磅升级 升级内容 新增 参数配置 IP 地址黑白名单过滤器动态参数 新增 侧边栏是否展开第一个菜单的开关 first-open 新增 AesTypeHandler 处理字段数据加密解密或脱敏 新增 JsonTypeHandler …

AI换脸原理(7)——人脸分割参考文献TernausNet: 源码解析

1、介绍 这篇论文相对来说比较简单,整体是通过使用预训练的权重来提高U-Net的性能,实现对UNet的改进。该方法也是DeepFaceLab官方使用的人脸分割方法。在介绍篇我们已经讲过了UNet的网络结构和设计,在进一步深入了解TernausNet之前,我们先简单回顾下UNet。 U-Net的主要结构…

网络基础(三)——网络层

目录 IP协议 1、基本概念 2、协议头格式 2.1、报头和载荷如何有效分离 2.2、如果超过了MAC的规定&#xff0c;IP应该如何做呢&#xff1f; 2.3、分片会有什么影响 3、网段划分 4、特殊的ip地址 5、ip地址的数量限制 6、私有ip地址和公网ip地址 7、路由 IP协议 网络…

Docker尚硅谷_高级篇

Docker尚硅谷 高级篇一、Dockerfile1.1 Dockerfile1.2 构建过程1.3 Dockerfile保留字1.3 构建镜像1.4 虚悬镜像 二、Docker发布微服务2.1 搭建SpringBoot项目2.2 发布微服务项目到Docker容器 三、Docker网络3.1 Docker网络3.2 docker网络命令3.3 Docker网络模式3.4 docker03.5 …

sql注入之bool盲注

目录 盲注步骤 1、进入靶场 2、如下图所示输入&#xff1f;id1‘ 判断此时存在注入点 3、判断列数 ​编辑 4、开始盲注 普通的python脚本 代码思想 结果 二分查找python脚本 二分查找算法思想简介 二分查找与普通查找的主要差距 代码思想 代码 结果​编辑 下面以…

后端项目开发笔记

Maven打包与JDK版本不对应解决方法 我这里使用jdk8。 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configurat…