嵌入式全栈开发学习笔记---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,一经查实,立即删除!

相关文章

浅谈var let const

浅谈var let const var 在ES5中&#xff0c;顶层对象的属性和全局变量是等价的&#xff0c;用var声明的变量既是全局变量&#xff0c;也是顶层变量 var a 10; console.log(window.a) // 10使用var声明的变量存在变量提升的情况 console.log(a) // undefined var a 20// 编…

【C++语言】模板

当谈到C中的模板时&#xff0c;我们在谈论一种强大的工具&#xff0c;它允许程序员编写通用的代码&#xff0c;而不必为特定类型编写多个版本。模板使得编写可重用和灵活的代码变得更加容易&#xff0c;因为它们允许您编写与任何数据类型一起使用的通用算法和数据结构。 什么是…

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.在顶层组件中通…

基于springboot的校园闲置物品交易系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的校园闲置物品交易系统,…

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

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

Java高并发场景(银行转账问题)

最近面试问到了银行转账的高并发问题&#xff0c;回答的不是很理想&#xff0c;小编整理了下&#xff0c;题目大概如下&#xff1a; 有一张银行账号表&#xff08;银行账号字段、金额字段&#xff09;&#xff0c;A账号要给B账号转账&#xff0c;A扣款&#xff0c;B收款&#x…

牛客_非技术快速入门_题目总结

牛客_非技术快速入门_题目总结 SQL29 计算用户的平均次日留存率 描述 题目&#xff1a;现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。 示例&#xff1a;question_practice_detail id device_id quest_id result date 1 2138 111 wron…

@Transaction注解详情解释

概念&#xff1a; Transactional注解是Spring框架提供的一个用于声明式事务管理的注解&#xff0c;方便我们管理事务&#xff0c;保证数据的一致性与可靠性。 事务4个基本特性&#xff1a; 原子性&#xff1a;一个事务要不全部&#xff08;sql&#xff09;执行&#xff1b;要不…

Python图形界面(GUI)Tkinter笔记(四):控件的定位(2)

Tkinter(GUI)设计图形界面时有三种控件的包装方法去定位各控件在窗口(父容器、根窗口)上的位置。 【1】pack()方法:用方位来定位位置,类似于Word文档中的文字对齐方式。 【2】grid()方法:用二维表格式的坐标值定位,类似于EXCEL单元格坐标。 【3】place()方法:用窗口…

华为ce12800文件保存python之sftp

##CE12800 交换机上配置 [*SSH Server] dsa local-key-pair create [*SSH Server] sftp server enable [*SSH Server] ssh user adminadmin authentication-type password [*SSH Server] ssh user adminadmin service-type sftp [*SSH Server] ssh user adminadmin sftp-direc…

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

各位大佬好 &#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…