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

news2024/11/23 17:23:53

目录

指针和数组

用指针来表示数组

用数组来表示指针

笔试题19


上一篇复习了指针使用时的相关注意事项,这一篇我们开始复习指针和数组

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

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

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

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

我们正式开始:

指针和数组

用指针来表示数组

数组名就是数组首元素地址,指针用来保存地址数据。于是可以这样写:

int *p = a; //a是一个数组

下面就可以通过指针来访问数组。

*p表示a[0]    也可以写成p[0]

*(p + 1)表示a[1]  也可以写成p[1]

*(p + 2)表示a[2]  也可以写成p[2]

...

用数组来表示指针

指针就是数组、数组就是指针,可以这么说,但是不严谨

可以通过数组的形式访问指针指向的内容

char *ptr = “helloworld”;

ptr[0]表示字符'h'

ptr[1]表示字符'e'

....

笔试题19

int a[5] = {1, 2, 3, 4, 5};

int *p1 = (int*)(&a + 1);

int *p2 = (int*)((int)a + 1);

int *p3 = (int*)(a + 1);

p1[0], p2[0], p3[0]的值分别为多少?

解:

int *p1 = (int*)(&a + 1);//&a是取整个数组的地址,数组地址加1就跨越这个数组。&a + 1已经跳到了数组a的外面,再强制类型转换成int*,不强转也可以,因为&a + 1本身就是int*,只是不强转的话含义是不一样的,原来是一个地址,强转后是一个整数类型的地址。值是不变的,只是含义不一样。最后再赋值给int*的指针p1,那p1就指向了0x114这块空间,也就是说p1里面存的值就是0x114,这个0x114可以理解为下一个数组的地址。

int *p2 = (int*)((int)a + 1);//a原本是数组首元素的地址0x100,(int)a强制类型转换成int型的整数,也就是将0x100转换成整数100;然后(int)a + 1,就变成了100+1等于101;(int*)((int)a + 1)再将101强制转换成int*型,也就是将101转换成int*的指针,指向地址0x101,赋值给指针p2,p2也指向0x101,而0x101是数组a首元素的第二个字节的地址

int *p3 = (int*)(a + 1);//a是首元素的地址,+1就变成第二个元素的地址,然后再强制类型转换成int*型的指针,其实(a + 1)本身就是int*,不强制类型转换也可以。最后赋值给p3,于是p3指向第二个元素的地址,也就是0x104。

以上只有p3是一个正常的指针,其他两个都是不正常的,因为在C语言中访问数组的时候一定是从数组的首元素的地址开始访问的,访问其他元素的地址一定是该数组元素类型的整数倍。比如说数组元素类型是int,那么指针指向的地址一定是int型的整数倍,0x100,0x104,0x108......正常情况下不可能是某个元素的某一个字节的地址,也不可能是指向数组所在的内存空间外的其他区域。

综上:

p1[0]代表的是:p1是指针,取指向的空间的第一个元素。而p1指向的是0x114,已经越界了,没有那个元素,没有那个数字,结果可能是“段错误”,也有可能是个随机值。

p2[0]代表的是:p2是指针,取指向的空间的第一个元素。而p2指向的是0x101,这个指针也不是正常的指针,结果可能是“段错误”,也有可能是个随机值。

p3[0]代表的是:p3是指针,取指向的空间的第一个元素。而p3指向的是0x104,结果是2。

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

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

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

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

相关文章

问题与解决:大华视频后台播放报错

大华播放器接到BI系统后,实时监控视频后台播放一段时间后,报错如下: The play() request was interrupted because video-only background media was paused to save power. 在谷歌浏览器下,直接用代码运行系统,视频在…

XP316,XP351中控DCS模块

XP316,XP351中控DCS模块。在设计分布式系统时,需要考虑以下原则可靠性:系统应该能够在节点故障的情况下继续工作,同时保证数据的一致性和可靠性。XP316,XP351中控DCS模块(2)可扩展性:保证用户的响应时间。安…

Tableau学习2.0版——复习

官网下载链接:https://www.tableau.com/zh-cn/support/releases 学生账户申请链接:https://www.tableau.com/zh-cn/academic/students。直接去学信网下载学籍在线验证作为申请证明。 目录 1、可视化原理 2、基础图表制作 2.1 对比分析(比…

自动化机器学习——神经网络架构搜索

自动化机器学习——神经网络架构搜索 随着深度学习在各领域的广泛应用,设计高效的神经网络架构变得至关重要。传统的神经网络架构设计通常依赖于人工经验和试错,这种方式往往效率低下且不保证找到最优解。因此,自动化机器学习中的神经网络架…

通过自建镜像方式搭建RabbitMQ集群

通过自建镜像方式搭建RabbitMQ集群 1. 应用准备1.1 应用目录结构1.2 配置文件1.2.1 .erlang.cookie1.2.2 hosts1.2.3 rabbitmq.conf1.2.4 rabbitmq-env.conf 2. 编写DockerFile2.1 将所有本地文件拷贝到工作目录2.2 拷贝文件到源目录&增加执行权限2.3 安装Erlang & rab…

sqli-labs 第八关盲注python脚本

目录 ​编辑 判断库名 1.库名长度 2.库名 import requests import mathurl "http://127.0.0.1/Less-8"def dblength():for i in range(20):payload f"1 and length(database())>{i}-- "data {id: payload}res requests.get(url, paramsdata)if …

异常检测的学习和实战

1.应用: 1.在工业上的应用 当检测设备是否处于异常工作状态时,可以由上图分析得到:那些零散的点对应的数据是异常数据。因为设备大多数时候都是处于正常工作状态的,所以数据点应该比较密集地集中在一个范围内,而那些明…

Attention-guided Feature Distillation for Semantic Segmentation

摘要 与现有的复杂方法相比,该方法通常用于从老师那里提取知识给学生,该方法展示了一种简单而强大的方法,可以利用精细的特征映射来转移注意力。事实证明,该方法在提取丰富信息方面是有效的,在作为密集预测任务的语义…

Obsidian/Typora设置图床

在obsidian中默认图片是保存在本地的,但是在要导出文档上传到网上时,由于图片保存在本地,会出现无法加载图片的问题。 这里引用的一段话: 这里使用picgo-core和gitee实现图床功能, 参考1: Ubuntu下PicGO配…

Python中bisect模块

Python中bisect模块 在Python中,如果我们想维持一个已排序的序列,可以使用内置的bisect模块,例如: import bisect# 用于处理已排序的序列 inter_list [] bisect.insort(inter_list, 3) bisect.insort(inter_list, 2) bisect.in…

2.监督/非监督学习

参考链接为:https://hands1ml.apachecn.org/1/ 机器学习可以根据训练时监督的量和类型进行分类。主要有四类:监督学习、非监督学习、半监督学习和强化学习。 本文将简单介绍监督学习和非监督学习 监督学习 在监督学习中,用来训练算法的训练…

39-5 入侵检测系统(IDS)- 安装配置IDS(安装成功)

官网:Snort Rules and IDS Software Download 参考: (这位大佬分享了安装包下载链接):https://www.cnblogs.com/taoyuanming/p/12722263.html (安装过程参考这位大佬):Snort 安装与配置(CentOS 7)_centos 7 snort-CSDN博客一、安装 IDS(我这里在 CentOS 7 虚拟机中安…

python3 Fatal error in launcher: Unable to create process using

python 环境变量 在window系统环境变量 path 中配置 python 的安装目录,目录层级至paython 的安转目录即可。 pip环境变量配置 在path 中增加配置 paython 安装目录下 Scripts 子目录的环境变量。 以上配置完成后,win R 打开命令窗口,输…

mysql中的页和行

页 行即表中的真实行,‘行式数据库’的由来 虽然MySQL的数据文件(例如.ibd文件)中的数据页在物理上是通过链表连接的,但是在逻辑上,MySQL使用B树来组织和访问数据。 行:主要是dynamic类型

C++Windows11平台通过CMake在VS2022上面配置Googletest1.14.0

Release v1.14.0 google/googletest (github.com),在官网下载Googletest1.14.0(Release版本,本博客默认你已经安装好了CMake)。 将下载好的压缩包解压到你的文件夹。 打开对应的文件夹。 开启控制台窗口,依次输入以下命令 mkd…

用户登录后端:登录密码解密后用PasswordEncoder验证密码是否正确

前置知识: 前端登录加密看用户登录 PasswordEncoder加密看PasswordEncoder详解 项目中因为要判断用户登录密码是否正确,通过输入错误次数锁住用户 1.后端配置rsa私钥 #密码加密传输,前端公钥加密,后端私钥解密 rsa:private_key: xxxx2. 读…

Linux学习之路 -- 文件系统 -- 缓冲区

前面介绍了文件描述符的相关知识,下面我们将介绍缓冲区的相关知识。 本质上来说,缓冲区就是一块内存区域,因为内核上的缓冲区较复杂,所以本文主要介绍C语言的缓冲区。 目录 1.为什么要有缓冲区 2.应用层缓冲区的默认刷新策略 …

【C++】————类与对象(上)-基础知识

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 类的两种定义方式: 成员变量命名规则的建议: 4.类的访问限定符及封装 4.1 访问限定符 ​编辑 【面试题】问题:C中struct和class的区别是什么? 4.2 封装 【面试…

VPN方案和特点

VPN方案和特点 VPN,或者称为虚拟专用网络,是一种保护你的在线安全和隐私的技术。它可以创建一个加密的连接,使你的在线活动对其他人不可见。以下是一些常见的VPN协议和它们的特点: 开放VPN (OpenVPN):这是一种极为可…

基于SSM的“学生网上请假系统 ”的设计与实现(源码+数据库+文档)

基于SSM的“学生网上请假系统 ”的设计与实现(源码数据库文档) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 主页界面 登录界面 班级信息添加界面 院系信息…