嵌入式全栈开发学习笔记---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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用hMailServer+roundcubemail+宝塔安装配置一个自己的邮箱服务

用hMailServerroundcubemail安装配置一个自己的邮箱服务 1、准备工具与资料&#xff1a; 云服务器一台 基础配置就行 2核4G。域名一个 以下用lizipro.cn示例。hMailServer安装包roundcubemail安装包异常处理插件补丁&#xff1a; libmysql.zip 2、hMailServer服务安装&#…

QToolButton的特殊使用

QToolButton的特殊使用 介绍通过QSS取消点击时的凹陷效果点击时的凹陷效果通过QSS取消点击时的凹陷效果 介绍 该篇文章记录QToolButton使用过程中的特殊用法。 通过QSS取消点击时的凹陷效果 点击时的凹陷效果 通过QSS取消点击时的凹陷效果 #include <QToolButton> #i…

加密与CA证书

文章目录 加密与CA证书http协议是不安全的使用对称秘钥进行数据加密非对称秘钥加密CA证书应用补充 加密与CA证书 CA 证书是什么&#xff0c;证书的目的是什么 首先明确一点&#xff0c;CA证书是数字时代中确保身份和数据安全的重要工具&#xff0c;为用户提供了安心、便捷和可…

齿轮端面倒棱刀具设计及模拟,记录一下

最近&#xff0c;我深陷在一项复杂且繁琐的任务中&#xff0c;几乎快要被其折磨得近乎疯狂。然而&#xff0c;经过一番努力&#xff0c;我终于迎来了曙光&#xff0c;成功完成了齿轮端面倒棱刀具加工的计算模拟。 这项任务&#xff0c;犹如一场旷日持久的战斗&#xff0c;每一…

小程序获取手机号,用户昵称,头像

一、手机号 在微信小程序中&#xff0c;获取用户手机号也需要用户的明确授权。你可以使用 button 组件的 open-type 属性设置为 getPhoneNumber 来实现这个功能。当用户点击这个按钮时&#xff0c;会弹出一个对话框请求用户的授权。如果用户同意&#xff0c;你可以在 bindgetp…

03.Linux文件操作

1.操作系统与Linux io框架 1.1 io与操作系统 1.1.1 io概念 io 描述的是硬件设备之间的数据交互&#xff0c;分为输⼊ (input) 与输出 (output)。 输⼊&#xff1a;应⽤程序从其他设备获取数据 (read) 暂存到内存设备中&#xff1b;输出&#xff1a;应⽤程序将内存暂存的数据…

数据链路层(详细版)【02】

接 数据链路层&#xff08;详细版&#xff09;【01】 文章目录 四、以太网MAC层&#xff08;一&#xff09;MAC地址组成&#xff08;1&#xff09;48位MAC地址格式&#xff08;2&#xff09;单播地址 & 多播地址 & 广播地址&#xff08;3&#xff09;全球管理 & 本…

如何优雅简单地写 Controller 层代码?

本篇就来介绍一下&#xff0c;如何写好一个 controller &#xff0c;让你的接口变的更加优雅&#xff01; 一个完整的后端请求由 4 部分组成&#xff1a; 接口地址&#xff08;也就是 URL 地址&#xff09; 请求方式&#xff08;一般就是 get、set&#xff0c;当然还有 put、…

HDFS HA 修改nameservice

本例中修改将原来的hdfs-ha 修改为 hdfs-ns 停止HDFS, 防止新的业务操作 等待停止结束 KDE中需要调整的配置项如下图所示 a.搜索栏找到fs.defaultFS&#xff0c;将hdfs://hdfs-ha改为hdfs://hdfs-ns b.搜索栏找到dfs.nameservices&#xff0c;将hdfs-ha改为hdfs-ns c.搜索栏找…

DE2-115开发板基于verilog和nioⅡ的流水灯实现

目录 一、 内容概要二、 实现2.1 基于Nios II软核的流水灯2.1.1 准备工作2.1.2 工程搭建2.1.3 硬件代码设计Ⅰ 连接IP核Ⅱ 编写代码Ⅲ 各种配置 2.1.4 软件代码设计Ⅰ 环境构建Ⅱ 编写代码 2.1.5 代码下载Ⅰ 硬件下载Ⅱ 软件下载 2.1.6 运行结果 2.2 Verilog流水灯 三、 心得体…

5.10.4 Vision Transformer的条件位置编码(CPE)

用于视觉 Transformer 的条件位置编码&#xff08;CPE&#xff09;方案与之前预定义且独立于输入标记的固定或可学习位置编码不同&#xff0c;CPE 是动态生成的&#xff0c;并以输入标记的局部邻域为条件。 CPE 可以轻松泛化到比模型在训练期间见过的输入序列更长的输入序列。…

Mysql8.0修改配置文件my.ini的坑

出现的问题&#xff1a;一般直接双击打开my.ini文件默认会用系统自带的记事本打开&#xff0c;如果打开后修改了其中的内容并通过记事本直接保存的话&#xff0c;下次重启就会导致mysql无法启动。 原因是mysql会以ANSI编码读取my.ini文件。 解决办法&#xff1a;使用notepad打…

Imitation Learning学习记录(理论例程)

前言 最近还是衔接着之前的学习记录&#xff0c;这次打算开始学习模仿学习的相关原理&#xff0c;参考的开源资料为 TeaPearce/Counter-Strike_Behavioural_Cloning: IEEE CoG & NeurIPS workshop paper ‘Counter-Strike Deathmatch with Large-Scale Behavioural Clonin…

现代制造之3D打印技术进行零件加工

现代制造 有现代技术支撑的制造业&#xff0c;即无论是制造还是服务行业&#xff0c;添了现代两个字不过是因为有了现代科学技术的支撑&#xff0c;如发达的通信方式&#xff0c;不断发展的互联网&#xff0c;信息化程度加强了&#xff0c;因此可以为这两个行业增加了不少优势…

简单易懂的Java Queue入门教程!

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

600/天,海外项目值班,接不接?

朋友介绍了一个海外项目&#xff0c;广告系统短期维护&#xff0c;刚上线需要维护14天也就是2个星期&#xff0c;费用单价600/天&#xff0c;主要工作内容&#xff1a;北京晚上12点-早上8点值班&#xff0c;如果有问题及时响应并修复。 如果我年轻10岁&#xff0c;这个项目我倒…

【网站项目】SpringBoot803房屋租赁管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

C++入门指南(上)

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