进阶指针(四)—— 加强对指针,数组名,sizeof,strlen的理解

图片来源于网络

✨博客主页:小钱编程成长记
🎈博客专栏:进阶C语言
🎈推荐相关博文:进阶C语言(一)、进阶C语言(二)、进阶C语言(三)

进阶指针(四)

  • 1.一维数组
    • 1.1 理解sizeof()里一维数组数组名的意义
  • 2.字符数组
    • 2.1 理解sizeof()里 char arr[] = {'a','b','c','d','e','f'};的数组名的意义
    • 2.2 理解strlen()里 char arr[] = {'a','b','c','d','e','f'};的数组名的意义
    • 2.3 理解sizeof()里 char arr[] = "abcdef"; 的数组名的意义
    • 2.4 理解strlen()里 char arr[] = "abcdef"; 的数组名的意义
  • 3.理解字符串指针
    • 3.1 理解sizeof()里字符串指针p的意义
    • 3.2 理解strlen()里字符串指针p的意义
  • 4.二维数组
    • 4.1 理解sizeof()里数组名的意义
  • 知识总结
  • 结语:

我们通过对指针和数组笔试题的分析来增强对指针,数组名,sizeof和strlen的理解。

1.一维数组

1.1 理解sizeof()里一维数组数组名的意义

int a[] = {1,2,3,4};//四个元素,每个元素都是int类型的(4字节),共16字节。

小知识:

数组名的理解:数组名是数组首元素地址。
但有两个例外:
1.sizeof(数组名)。(sizeof是操作符)
2.&数组名
sizeof的返回值是size_t类型的,要用%zd去打印

  1. printf(“%zd\n”, sizeof(a)); // 16
    数组名单独放在sizeof内部,数组名表示整个数组,计算的是整个数组的大小,单位是字节。
  2. printf(“%zd\n”, sizeof(a+0); // 4/8
    a并非单独放在sizeof内部,也没有&,所以a就是首元素地址。
  3. printf(“%zd\n”, sizeof(*a)); // 4
    非单独,解引用首元素地址a,得第一个元素。 *a == a[0] == * (a+0)
  4. printf(“%zd\n”, sizeof(a+1)); // 4
    非单独,求的是第一个元素的地址。 *a == a [0] == * (a+0)
  5. printf(“%zd\n”, sizeof(a[1])); // 4
    非单独,求的是第二个元素,下标为1的元素的大小。
  6. printf(“%zd\n”, sizeof(&a)); // 4/8
    &数组名,求的是整个数组的地址的大小。整个数组的地址也是地址。

小知识:

数组的地址和数组首元素的地址的本质区别是类型,而非大小。

》如图:
在这里插入图片描述

  1. printf(“%zd\n”, sizeof( * &a)); // 16

小知识:

第一种理解方式:
对int类型的元素的地址* ,访问的大小是int的大小。 对整个数组的地址 *,访问的空间是整个数组的大小(单位是字节)。
第二种理解方式:
*&a == a 既取地址又解引用,两种操作符的效果相抵消了。

  1. printf(“%zd\n”, sizeof(&a+1)); // 4/8
    &a是数组指针类型的,+1跳过数组的大小,但仍然是地址。
    在这里插入图片描述

  2. printf(“%zd\n”, sizeof(&a[0])); // 4/8
    求的是第一个,下标为0的元素的地址的大小。

  3. printf(“%zd\n”, sizeof(&a[0]+1)); // 4/8
    &a[0]是第一个元素的地址,+1跳过一个元素,指针指向第二个元素,求的是第二个元素的地址的大小。
    &a[1] == &a[0]+1 == a+1

2.字符数组

2.1 理解sizeof()里 char arr[] = {‘a’,‘b’,‘c’,‘d’,‘e’,‘f’};的数组名的意义

和上一组差不多

char arr[] = {'a', 'b', 'c', 'd', 'e', 'f'};//共6个字节
  1. printf(“%zd\n”, sizeof(arr)); // 6
    单独放,数组名表示的是整个数组。
  2. printf(“%zd\n”, sizeof(arr+0)); // 4/8
    非单独,数组名表示的是首元素地址。
  3. printf(“%zd\n”, sizeof(*arr)); // 4/8
    非单独,
  4. printf(“%zd\n”, sizeof(arr[1])); // 1
    求的是下标为1的元素的大小。
  5. printf("%zd\n ", sizeof(&arr)); // 4/8
    数组的地址也是地址。
  6. printf(“%zd\n”, sizeof(&arr+1)); // 4/8
    跳过一个数组大小之后的地址。
  7. printf("%zd\n ", sizeof(&arr[0]+1)); // 4/8
    &arr[0]是第一个元素的地址,+1得到第二个元素的地址。

2.2 理解strlen()里 char arr[] = {‘a’,‘b’,‘c’,‘d’,‘e’,‘f’};的数组名的意义

char arr[] = {'a','b','c','d','e','f'};//共6字节

小知识:

![在这里插入图片描述](https://img-blog.csdnimg.cn/0

  • strlen是库函数,需要头文件string.h。
  • strlen的参数是指针,返回类型是size_t无符号整型,用%zd打印。
  • strlen返回的是 从 给出的指针指向的字符 到 \0之间的字符的个数(不包含\0)。
  1. printf(“%zd\n”, strlen(arr)); // 随机值
    这里的arr不属于那两个例外,所以是数组首元素地址,打印出来的是首元素地址指向的字符 到 \0之间的字符的个数(不包含\0)。又因为字符数组中没有\0,也不知道在内存中字符数组后面什么时候才能遇到\0。所以打印出来的是随机值。

  2. printf(“%zd\n”, strlen(arr+0); // 随机值
    arr+0表示的也是首元素地址,和上面情况一样。

  3. printf(“%zd\n”, strlen(*arr)); // 报错
    1、arr是首元素地址,*arr是首元素’a’,字符’a’在内存中存的是ASCII码97,但strlen需要的参数是地址,strlen会把97当作地址。
    2、strlen要想找到 \0 结束统计,就需要先从传给它的指针开始解引用找\0。 站在strlen的角度认为传参传进去的’a’-97就是地址,97是一个未知地址,是没有理由凭空出现的或对应的空间未提前开辟的地址,若直接进行访问,就是非法访问,会报错。

  4. printf("%zd\n ", strlen(arr[1])); // 报错
    和上一个情况一样,都是将数组元素直接传给了strlen函数。

  5. printf("%zd\n ", strlen(&arr)); // 随机值
    strlen的参数和返回类型为:
    size_t strlen(const char * str)
    如果传给strlen的指针的类型不是const char*,则传入函数时会被强制转换成const char类型。
    &arr–char( * )[6]–>const char
    整个数组的地址和首元素的地址在数值上一样,返回这个地址上的字符到\0之间的字符个数(不包括\0),因为数组上没有\0,也不知道内存中数组后面什么地方有\0,所以返回的是随机值。

  6. printf("%zd\n ", strlen(&arr+1)) ; // 随机值
    从跳过一个数组大小之后的地址开始,解引用找\0,返回之间的字符个数(不包括\0)。在这里插入图片描述

  7. printf ("%zd\n ", strlen(&arr[0]+1)); // 随机值
    返回的是第二个元素地址上的字符到\0之前出现的字符的个数。

2.3 理解sizeof()里 char arr[] = “abcdef”; 的数组名的意义

char arr[] = "abcdef"; //共7字节,因为还有隐藏的\0
  1. pirntf("%zd\n ", sizeof(arr)); // 7
    数组名是单独放在sizeof()中的。

  2. printf("%zd\n ", sizeof(arr+0)); // 4/8
    非单独放,数组名是首元素地址。

  3. printf("%zd\n ", sizeof(*arr)); // 1
    非单独放,*arr是首元素。

  4. printf("%zd\n ", sizeof(arr[1])); // 1
    下标为1的元素的大小。

  5. printf("%zd\n ", sizeof(&arr)); // 4/8
    整个数组的地址也是地址,是地址就是4(32位)/8(64位)字节

  6. printf("%zd\n ", sizeof(&arr+1)); // 4/8
    计算的是跳过一个数组之后的地址的大小。
    在这里插入图片描述

  7. printf("%zd\n ", sizeof(&arr[0]+1)); // 4/8
    第二个元素的地址。

2.4 理解strlen()里 char arr[] = “abcdef”; 的数组名的意义

char arr[] = "abcdef"; //共7字节,因为还有隐藏的\0
  1. printf("%zd\n ", strlen(arr)); // 6
    strlen()中数组名是首字符地址,具体分析过程前面说过了。

  2. printf("%zd\n ", strlen(arr+0)); // 6
    返回arr上的字符到\0之间的字符的个数。字符串最后隐藏了一个\0。

  3. printf("%zd\n ", strlen(*arr)); // 非法访问,报错
    *arr是首元素。具体分析前面说过了。

  4. printf("%zd\n ", strlen(arr[1])); // 非法访问,报错
    arr[1]是第二个元素。具体分析前面说过了。

  5. printf("%zd\n ", strlen(&arr)); // 6
    数组地址在数值上==首字符地址。

  6. printf("%zd\n ", strlen(&arr+1)); // 随机值
    &arr+1是跳过一个数组之后的地址,从这开始到\0之前有几个字符,未知。
    在这里插入图片描述

  7. printf("%zd\n ", strlen(&arr[0]+1)); // 5
    &arr[0]+1是第二个元素的地址,它对应的字符到\0之间有5个字符。
    在这里插入图片描述

3.理解字符串指针

char *p = "abcdef";

小知识:

  • 指针是用来存放地址的,所以指针的大小就等于地址的大小。
  • 常量字符串作为表达式时的结果是首字符的地址,所以p中存放的是’a’的地址,但内存中肯定是存储着"abcdef"的。

3.1 理解sizeof()里字符串指针p的意义

char *p = "abcdef";
  1. printf("%zd\n ", sizeof(p )); // 4/8
    p是指针,大小和地址的大小一样,是 4(32位)/ 8(64位)。

  2. printf("%zd\n ", sizeof(p+1)); // 4/8
    指针p+1还是地址。在这里插入图片描述

  3. printf("%zd\n ", sizeof(*p)); // 1
    p中存放的是首字符地址,*p就是首字符,大小为1。

  4. printf("%zd\n ", sizeof(p[0])); // 1
    C语言规定p[0]=*(p+0)
    若将字符串想象成字符数组,则p[0]就是首元素 / 首字符。

  5. printf("%zd\n ", sizeof(&p)); // 4/8
    指针变量的地址也是地址。

  6. printf("%zd\n ", sizeof(&p+1)); // 4/8
    跳过&p存放的p / 跳过一个p的类型的大小。在这里插入图片描述

  7. printf("%zd\n ", sizeof(&p[0]+1)); // 1
    p[0]是首字符,*p[0]就是首字符地址,+1跳过一个字符的大小,指向第二个元素。在这里插入图片描述

3.2 理解strlen()里字符串指针p的意义

char *p = "abcdef";
  1. printf("%zd\n ", strlen(p )); // 6
    p是字符串的首字符地址。

  2. printf("%zd\n ", strlen(p+1)); // 5
    在这里插入图片描述

  3. printf("%zd\n ", strlen(*p)); // 非法访问,报错
    参数应该是指针,但这里却传的是字符。具体错误原因分析前面已经讲过了。

  4. printf("%zd\n ", strlen(p[0])); // 非法访问,报错
    p[0] == *(p+0) 是首字符,应该传指针。具体错误原因分析前面已经讲过了。

  5. printf("%zd\n, strlen(&p)); // 随机值
    从&p往后开始解引用(因为p的类型的大小是4/8字节,所以每次解引用访问4/8个字节)找\0,并返回之间的字符的个数。
    在这里插入图片描述

  6. printf("%zd\n ", strlen(&p+1)); // 随机值
    和上面一个类似。&p+1是&p跳过一个p的类型的大小。

  7. printf("%zd\n ", strlen(&p[0]+1)); // 6
    &p[0] == &*(p+0) == p。p中存放的是首字符的地址,返回p指向的字符与\0之间的字符的个数。

4.二维数组

4.1 理解sizeof()里数组名的意义

int a[3][4] = {0};
  1. printf("%zd\n ", sizeof(a)); // 48
    数组名a单独放在了sizeof内部,表示整个数组,sizeof(a)计算的是数组的大小,单位是字节。

  2. printf("%zd\n ", sizeof(a[0][0])); // 4
    a[0][0]是二维数组的第一行第一个元素。

  3. printf("%zd\n ", sizeof(a[0])); // 16
    小知识:
    在这里插入图片描述
    a[0]是第一行这个一维数组的数组名,数组名单独放在了sizeof()内部,a[0]就表示整个第一行这个一维数组,sizeof(a[0])计算的是整个第一行这个一维数组的大小,单位为字节。

  4. printf("%zd\n ", sizeof(a[0]+1)); // 4/8
    a[0]并非单独放在sizeof()内部,也没有&,所以a[0]表示首元素地址,也就是第一行第一个元素的地址。

  5. printf("%zd\n ", sizeof(*(a[0]+1))); // 4
    a[0]是第一行数组的数组名,未单独放在sizeof()里,所以表示第一个数组的首元素地址。在这里插入图片描述

  6. printf("%zd\n ", sizeof(a+1)); // 4/8
    a非单独放在sizeof()里,也没有&,所以表示首元素地址,也就是第一个一维数组的地址。a的类型是int(*)[4],+1跳过一个数组的大小,a+1就是第二个数组的地址
    在这里插入图片描述

  7. printf("%zd\n, sizeof(*(a+1))); // 4/8
    1、a是首元素地址,就是第一个一维数组的地址,类型是int( * )[4]。 +1时跳过一个int( * ) 的大小。*解引用时访问一维数组的大小。
    2、从另一个角度理解: *(a+1) == a[1],sizeof(a[1])—第二行的数组名单独放在了sizeof内部,计算的是第二行的大小。

  8. printf("%zd\n ", sizeof(&a[0]+1)); // 4/8
    &a[0]是第一个数组的地址(&a[0] == & * (a+0) == a),类型是int(*)[4],+1跳过一个数组的大小,&a[0]+1就是第二个数组的地址。

  9. printf("%zd\n ", sizeof(*(&a[0]+1))); // 16
    由上一题知:&a[0]+1是第二个一维数组的地址,类型为int( * )[4],所以 * 解引用访问的空间大小是有4个元素的整型数组的大小,sizeof计算的是第二个数组的大小。

  10. printf("%zd\n ", sizeof(*a)); // 16
    a是二维数组数组名,非单独放在sizeof()中,所以表示第一个一维数组的地址。解引用后得到第一个一维数组。

  11. printf("%zd\n ", sizeof(a[3])); // 16,不会产生越界访问

小知识:

编译器用sizeof计算表达式的大小时,是通过类型计算的大小,并不会真的去访问表达式 / 获取表达式的值。a[3]在这里和a[0]的类型是一样的,都是int( * )[4],所以产生的效果或者说大小是一样的。

  • 比如:int a = 10; 计算a的大小时,表面是sizeof(a),真正的应该是sizeof(int)

表达式有2个属性:值属性,类型属性。例如:2+3 = 5 或int ,5就是值属性结果,int是类型属性结果。

知识总结

数组名的理解:数组名是数组首元素地址。
但有两个例外:
1.sizeof(数组名)。(sizeof是操作符)
2.&数组名
sizeof的返回值是size_t类型的,要用%zd去打印

数组的地址和数组首元素的地址的本质区别是类型,而非大小。

对int类型的元素的地址 * ,访问的大小是int的大小。
对整个数组的地址 *,访问的空间是整个数组的大小(单位是字节)。

指针+1跳过几个字节取决于指针指向的数据是什么类型的,指向什么类型的数据,+1就跳过什么类型的大小。

*&a == a 既取地址又解引用,两种操作符的效果相抵消了。

&a[0] == &a[0]+1 == a+0

传给strlen的地址一定要是程序已知的,不是凭空出现的,编译器提前开辟的空间的,未被释放的空间的。

![在这里插入图片描述](https://img-blog.csdnimg.cn/0

  • strlen是库函数,需要头文件string.h。
  • strlen的参数是指针,返回类型是size_t无符号整型,用%zd打印。
  • strlen返回的是 从 给出的指针指向的字符 到 \0之间的字符的个数(不包含\0)。

strlen的参数和返回类型为:
size_t strlen(const char * str)
如果传给strlen的指针的类型不是const char*,则传入函数时会被强制转换成const char类型。
&arr–char( * )[6]–>const char
整个数组的地址和首元素的地址在数值上一样。

在这里插入图片描述

在这里插入图片描述

编译器用sizeof计算表达式的大小时,是通过类型计算的大小,并不会真的去访问表达式 / 获取表达式的值。a[3]在这里和a[0]的类型是一样的,都是int( * )[4],所以产生的效果或者说大小是一样的。

  • 比如:int a = 10; 计算a的大小时,表面是sizeof(a),真正的应该是sizeof(int)

表达式有2个属性:值属性,类型属性。例如:2+3 = 5 或int ,5就是值属性结果,int是类型属性结果。

结语:

本篇文章通过对题目的讲解,加强了对指针,数组名,sizeof,strlen的理解。
最后,感谢大家的阅读!大家一起进步!

点赞收藏加关注,C语言学习不迷路!
图片来源于网络

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

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

相关文章

QT:绘图

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> //绘图事件class Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent 0);~Widget();void paintEvent(QPaintEvent *event); //重写绘图事件void timerEve…

GD32F10X ----RTC

1. RTC的简介 STM32 的实时时钟&#xff08;RTC&#xff09;是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC 模块和时钟配置…

格拉姆角场GAF将时序数据转换为图像并应用于东南大学轴承故障诊断(Python代码,CNN模型)

1.运行效果&#xff1a;格拉姆角场GAF将时序数据转换为图像并应用于东南大学轴承故障诊断&#xff08;Python代码&#xff0c;CNN模型&#xff09;_哔哩哔哩_bilibili 环境库 只要tensorflow版本大于等于2.4.0即可运行 2.GAF的内容 GAF是一种用于时间序列数据可视化和特征提…

LLM-TAP随笔——大语言模型基础【深度学习】【PyTorch】【LLM】

文章目录 2.大语言模型基础2.1、编码器和解码器架构2.2、注意力机制2.2.1、注意力机制&#xff08;Attention&#xff09;2.2.2、自注意力机制&#xff08;Self-attention&#xff09;2.2.3、多头自注意力&#xff08;Multi-headed Self-attention&#xff09; 2.3、transforme…

【C++】笔试训练(三)

目录 一、选择题二、编程题1、字符串中找出连续最长的数字串2、数组中出现次数超过一半的数字 一、选择题 1、以下程序的输出结果是&#xff08;&#xff09; #include <stdio.h> int main() {char a[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }, * p;int i;i 8;p a i;p…

【JVM】双亲委派模型

双亲委派模型 1. 什么是双亲委派模型2. 双亲委派模型的优点 1. 什么是双亲委派模型 提到 类加载 机制&#xff0c;不得不提的一个概念就是“双亲委派模型”。 双亲委派模型指的就是 JVM 中的类加载器如何根据类的全限定名找到 .class 文件的过程 类加载器: JVM 里面专门提供…

【ESP32 + Edge Impulse平台】运行AI算法模拟多传感器数据融合实现异常检测

本篇博文主要以ESP32+MQ Sensor 气体传感器为例,通过连接 Edge Impulse 平台,实现数据的实时采集和训练,进而实现在嵌入式设备上部署 ML 机器学习。本教程介绍如何使用 Edge Impulse 和机器学习来实现ESP32 异常检测系统,系统使用一个机器学习模型,检测气体何时出现异常。…

OpenCV查找和绘制轮廓:findContours和drawContours

1 任务描述&#xff1a; 绘制图中粗线矩形的2个边界&#xff0c;并找到其边界的中心线 图1 原始图像 2.函数原型 findContours( InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, …

2021-06-11 51蛋骗鸡用小数点作秒指示,分钟计时.(怎么用二个数码管做分的倒计时,DP亮灭来计秒)

缘由怎么用二个数码管做分的倒计时&#xff0c;DP亮灭来计秒,求思路 - 24小时必答区 #include "REG52.h" sbit K1 P1^5; sbit K2 P1^6; sbit K3 P1^7; sbit BUZ1P1^0; bit k0; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111,128};//0-9. unsign…

Polygon Miden:扩展以太坊功能集的ZK-optimized rollup

1. 引言 Polygon Miden定位为zkVM&#xff0c;定于2023年Q4上公开测试网。 zk、zkVM、zkEVM及其未来中指出&#xff0c;当前主要有3种类型的zkVM&#xff0c;括号内为其相应的指令集&#xff1a; mainstream&#xff08;WASM, RISC-V&#xff09;EVM&#xff08;EVM bytecod…

Kubernetes 学习总结(38)—— Kubernetes 与云原生的联系

一、什么是云原生&#xff1f; 伴随着云计算的浪潮&#xff0c;云原生概念也应运而生&#xff0c;而且火得一塌糊涂&#xff0c;大家经常说云原生&#xff0c;却很少有人告诉你到底什么是云原生&#xff0c;云原生可以理解为“云”“原生”&#xff0c;Cloud 可以理解为应用程…

[NOIP2011 提高组] 选择客栈

[NOIP2011 提高组] 选择客栈 题目描述 丽江河边有 n n n 家很有特色的客栈&#xff0c;客栈按照其位置顺序从 1 1 1 到 n n n 编号。每家客栈都按照某一种色调进行装饰&#xff08;总共 k k k 种&#xff0c;用整数 0 ∼ k − 1 0 \sim k-1 0∼k−1 表示&#xff09;&am…

机器学习——seaborn实用画图方法简介

0、seaborn简介: 前言:下面的总结只是介绍seaborn有哪些方法和属性,至于具体使用,通过下面给出的名称稍作查找即可。重点应该关注本文介绍的seaborn的使用方法seaborn与机器学习的关系: 知识图谱 0.1、了解即可的知识: seaborn:在matplotlib的基础上画一些更好看的图,在…

Mysql集群高可用架构MHA

Mysql集群高可用架构MHA 一、MHA概述1.1、 MHA 是什么1.2、 MHA 的组成1.3、 MHA 的特点 二、MHA高可用实例2.1、配置主从复制2.1、 安装 MHA 软件2.2、故障模拟2.3、故障修复 一、MHA概述 1.1、 MHA 是什么 MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的M…

计算机毕设 大数据全国疫情数据分析与3D可视化 - python 大数据

文章目录 0 前言1 课题背景2 实现效果3 设计原理4 部分代码5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的…

OpenCV之直线曲线拟合

直线拟合fitLine void fitLine( InputArray points, OutputArray line, int distType,double param, double reps, double aeps ); points:二维点的数组或vector line:输出直线,Vec4f (2d)或Vec6f (3d)的vector distType:距离类型 param:距离参数 reps:径向的精度参数 a…

【2023集创赛】加速科技杯三等奖作品:私密性高精度刷手身份认证系统

本文为2023年第七届全国大学生集成电路创新创业大赛&#xff08;“集创赛”&#xff09;加速科技杯三等奖作品分享&#xff0c;参加极术社区的【有奖征集】分享你的2023集创赛作品&#xff0c;秀出作品风采&#xff0c;分享2023集创赛作品扩大影响力&#xff0c;更有丰富电子礼…

【数据结构】排序之插入排序和选择排序

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;数据结构 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、排序的概念及其分类 &#x1f4d2;1.1排序的概念 &#x1f4d2;1.2排序…

HTML详细基础(二)文件路径

目录 一.相对路径 二.绝对路径 三.超链接标签 四.锚点链接 首先&#xff0c;扩展一些HTML执行的原理&#xff1a; htmL(hypertext markup Language) 是一种规范&#xff08;或者说是一种标准&#xff09;&#xff0c;它通过标记符&#xff08;tag&#xff09;来标记要显示…

【FreeRTOS】FreeRTOS移植stm32详细步骤介绍

我在查找FreeRTOS移植的相关教程特别少&#xff0c;所以想非常详细的介绍FreeRTOS移植stm32详细步骤&#xff0c;包括源码的下载&#xff0c;源码介绍&#xff0c;系统移植&#xff0c;代码验证等&#xff0c;每一步都有对应的介绍和解释&#xff0c;希望可以帮助到你们。 文章…