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

目录

指针和数组

用指针来表示数组

用数组来表示指针

笔试题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.mzph.cn/bicheng/10847.shtml

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

相关文章

【半夜学习MySQL】数据库中的数据类型(含数值类型、文本二进制类型、时间类型、String类型详谈)

🏠关于专栏:半夜学习MySQL专栏用于记录MySQL数据相关内容。 🎯每天努力一点点,技术变化看得见 文章目录 数据类型分类数值类型bit类型tinyint类型int类型float类型decimal类型 文本、二进制类型char类型varchar类型 时间类型Strin…

大模型日报2024-05-12

大模型日报 2024-05-12 大模型资讯 阿里巴巴新AI模型宣称超越OpenAI的GPT-4语言能力 摘要: 周四,阿里巴巴集团旗下的阿里云宣布推出其最新版大型语言模型。该模型声称在语言技能方面超越了OpenAI的GPT-4。阿里巴巴集团有限公司(纽交所代码:BA…

1.1. 离散时间鞅-条件期望

1.1. 离散时间鞅-条件期望 条件期望1. 条件期望的定义1.1. 条件期望的定义1.2. 条件期望的存在唯一性 2. 条件期望的示例2.1. X ∈ F X \in \mathcal{F} X∈F, X X X与 F \mathcal{F} F独立的情形2.2. X X X是有限 σ \sigma σ代数情形2.3. X X X是随机变量生成…

无障碍网络(Accessibility)

无障碍网络,有时也被称为Web无障碍,是确保所有人,包括那些有视觉、听力、肢体等障碍的人,都能够顺利、有效地使用网站和在线服务的一种指导原则和一种做法。无障碍网络的重要性无法过分强调。网络应该是公开、开放和无障碍的&…

[Flutter GetX使用] Getx路由和状态管理-GetController使用过程中的踩坑记录

文章目录 问题 - Get.find() 报错!原因总结A:路由和控制器设计a1:项目中的Get路由aa1.项目路由结构aa2.本项目路由的注意点: B: GetController的冷知识C: 总结来看D: 一些参考资料 问题 - Get.find() 报错! 刚接触Getx, 遇到 Get.find()确找不到, 进而报错的问题, 一时间有点没…

智慧旅游平台开发微信小程序【附源码、文档说明】

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…

Java 中 String 类的 split() 方法

split() 方法 是 Java 中 String 类的一个常用方法,用于将字符串按照指定的分隔符分割成一个字符串数组。 它是一个非常强大的工具,可以用于各种字符串处理任务,例如: 从字符串中提取单词将字符串解析成不同的部分将字符串转换为…

关于DDD和COLA的一些总结和思考

1|0思维:面向对象和面向过程 领域驱动设计本质上是讲的面向对象,但是谈面向对象,始终无法绕开面向过程,所以我们先好好说一下面向过程和面向对象这两个概念。 什么是面向过程呢,其实就是我们学习编程时最初被植入的逻辑…

【安全每日一讲】加强数据安全保护 共享数字化时代便利

前言 数据安全是数据治理的核心内容之一,随着数据治理的深入,我不断的碰到数据安全中的金发姑娘问题(指安全和效率的平衡)。 DAMA说,降低风险和促进业务增长是数据安全活动的主要驱动因素,数据安全是一种资…

sbt安装

一、sbt介绍 在Spark中,sbt(Scala Build Tool)是一个用于构建Scala项目的工具。它是Spark项目的主要构建工具之一,用于编译Scala代码、管理依赖项、打包应用程序以及执行其他与项目构建相关的任务。 sbt的用途在Spark开发中主要…

基于Nios软件实现流水灯+串口输出

基于NIOS-II软核实现流水灯串口输出 引言: ​ 在现代电子设计领域,FPGA(现场可编程门阵列)因其灵活性和并行处理能力而成为实现复杂数字系统的首选平台。Nios II,作为Altera(现为Intel旗下)提供…

算法训练Day26 | 332.重新安排行程 ● 51. N皇后 ● 37. 解数独

332.重新安排行程 class Solution { public:vector<string> result;bool backtracking(vector<vector<string>>& tickets, vector<bool>& used){if(result.size()tickets.size()1){return true;}for(int i0; i<tickets.size(); i){if(used…

重生之我要精通JAVA--第四周笔记

文章目录 接口接口的定义与使用接口中成员的特点接口和类之间的关系 JDK9新增的方法适配器设计模式 内部类什么是内部类&#xff1f;内部类的访问特点分类成员内部类获取成员内部类对象 静态内部类局部内部类匿名内部类格式细节使用场景 APIMathMath常用方法 SystemRuntimeObje…

ts 详细-学习

TS基础&#xff08;一&#xff09; 变量声明 ts的类型主要包括两种数据类型&#xff1a;原始数据类型和对象数据类型 原始数据类型和js的数据类型相似包括以下几种&#xff1a;布尔值&#xff0c;字符串&#xff0c;null,undefined以及Se6中的Symbol和BigInt的原址数据类型 …

VMware虚拟机故障:“显示指定的文件不是虚拟磁盘“,处理办法

一、故障现象 由于虚拟机宕机&#xff0c;强制重新启动虚拟机后显示错误&#xff0c;没有办法启动虚拟机。 虚拟机有快照&#xff0c;执行快照还原&#xff0c;结果也不行&#xff0c;反复操作&#xff0c;在虚拟机文件目录出现很多莫名文件 二、故障原因 根据故障提示&#…

数据结构(C):玩转链表

目录 &#x1f37a;0.前言 1.链表的概念 2.链表的分类 2.1带头不带头 2.2单向和双向 2.3循环和不循环 2.4主要使用的链表 3.链表的实现 3.1申请一个链表 3.2头插和尾插 3.2.1函数的形参问题 3.2.2二级指针问题解决 3.3头删和尾删 3.4打印链表 3.5查找 3.5销…

MySQL视图:数据库中的虚拟表与数据透视窗

前言 在数据库管理系统的世界里&#xff0c;MySQL视图扮演着一个独特而重要的角色&#xff0c;它如同数据库中的一扇窗&#xff0c;透过这扇窗&#xff0c;我们可以以不同的视角观察和操作数据&#xff0c;而无需直接触及底层表格的结构。本文将为您深入解析MySQL视图的定义、…

【谷粒商城】03创建商品模块

1.创建模块 2.创建项目微服务 商品服务、仓储服务、订单服务、优惠券服务、用户服务 共同&#xff1a; 1&#xff09;、web、openfeign 2&#xff09;、每一个服务&#xff0c;包名 com.atguigu.gulimall.xxx(product/order/ware/coupon/member) 3&#xff09;、模块名&#x…

​《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制德国每日风能和太阳能产量3D线图

在MATLAB中&#xff0c;要绘制3D线图&#xff0c;可以使用 plot3 函数。 在《MATLAB科研绘图与学术图表绘制从入门到精通》书中通过绘制德国每日风能和太阳能产量3D线图解释了如何在MATLAB中绘制3D线图。 购书地址&#xff1a;https://item.jd.com/14102657.html

future wait_for()成员、shared_future

future wait_for()成员 wait_for()&#xff1a;等待其异步操作操作完成或者超出等待&#xff0c;用于检查异步操作的状态。wait_for()可以接受一个std::chrono::duration类型的参数&#xff0c;它表示等待的最大时间&#xff0c;会返回一个std::future_status枚举值&#xff0…