<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Echotox</title>
    <link>https://echotox.com/</link>
    <description>技术探索与生活记录</description>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 02 Apr 2025 00:00:00 +0000</lastBuildDate>
    <ttl>60</ttl>
    <atom:link href="https://echotox.com/" rel="self" type="application/rss+xml"/>
    <item>
      <title>C语言指针小记</title>
      <link>https://echotox.com/posts/learning-pointers-c/</link>
      <pubDate>Wed, 02 Apr 2025 00:00:00 +0000</pubDate>
      <guid isPermaLink="true">https://echotox.com/posts/learning-pointers-c/</guid>
      <description type="html">&lt;h2 id=&#34;虚拟内存地址&#34;&gt;虚拟内存地址&lt;/h2&gt;
&lt;p&gt;在指针的学习之前，我们必须先了解内存，在我们设备的内存条中，有着自身的存储地址空间，操作系统将它的存储地址空间抽象成了一个巨大的一维数组空间，并且对于这个空间中的每一个字节都会分配一个编号，这个编号就叫做内存地址。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt;&lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt;&lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt;&lt;span class=&#34;cpf&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 声明了一个字符变量x1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x3&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;x4&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;&amp;#39;d&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;y3&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例如在上述代码当中，我声明了4个字符型的变量，并给他们赋了值，这时候，系统就会为他们分配空间来存放数据。假设当我们声明了这些变量之后，如果a的内存地址是101，那么下面b的就是102，以此类推，因为每个字符只占一个字节。那么如果里面存放的不是字符，而是整型呢？&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/learning-pointers-C/p01.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;我们知道，一个int类的整形占4个字节，那么在内存空间中的地址则是这样的:即每个int类的整形占了4个编号，也就是四个地址，但我们一般如果说y2的地址是多少？我们会说是它的首地址，也就是105&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/learning-pointers-C/p02.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;接下来实际操作一下:)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/learning-pointers-C/p03.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;在上述代码中，我声明了4个字符型的变量，并给他们赋了值，接下来打印出他们的地址，（在变量名前面的&amp;quot;&amp;amp;&amp;ldquo;符号是取地址符，可以获得这个变量的地址, %p代表的是我们要输出地址类型的数据，就像%d是输出整数类型的数据一样）我们可以看到，这个地址是16进制的，每个字符只占了一个字节。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/learning-pointers-C/p04.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;接着我们看这一段代码，我声明了2个int型的变量，并给它们赋了值，这时候让我们注意这两个地址的末尾，“8”和“C”，不就是相差了5吗，也就印证了我们之前的说法(一个int占5个字节)。&lt;/p&gt;
&lt;h2 id=&#34;指针的含义&#34;&gt;指针的含义&lt;/h2&gt;
&lt;p&gt;接下来就来到指针了。一般来讲，指针是用来存放内存地址的变量。也就是说，指针指向的就是一个变量的地址，创建一个指针变量就是在内存中分配了一块空间，通过指针就能找到这块空间的位置。&lt;/p&gt;
&lt;p&gt;其实通俗地讲，指针就是地址，当我们声明一个指针变量时，也就是声明了一个存放地址的变量。&lt;/p&gt;
&lt;h2 id=&#34;指针的创建与基本使用&#34;&gt;指针的创建与基本使用&lt;/h2&gt;
&lt;h3 id=&#34;指针的创建与赋值&#34;&gt;指针的创建与赋值&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt;&lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt;&lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt;&lt;span class=&#34;cpf&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;address a: %p, value a: %d&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;address b: %p, value b: %p&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，a是一个整形变量，当你声明了它之后，系统就会从内存中为它开辟一块空间，当你对a赋值的时候，是给这个空间中的数据赋值。但你不知道这个空间的位置（也就是地址）；&lt;/p&gt;
&lt;p&gt;b是一个指针变量（也可以叫做地址变量？），当你声明它之后，系统也会从内存中为它开辟一块空间，并且b代表的就是这个空间的位置（地址），当你对b赋值时，赋值的是一个地址，例如上述代码中，我把a的地址赋值给了b，这时候b的值就是a的地址。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/learning-pointers-C/p05.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;让我们观看上面的运行代码，我们分别输出了a和b的地址和值，可以看到，b的值就跟我们上面说的一样，是a的地址，这也就是指针的作用之一&lt;/p&gt;
&lt;p&gt;那么我们用指针b存放了a的地址，这时候，我们可以通过输出*b，来获得a的值，因为b中存放的是a的地址&lt;/p&gt;
&lt;p&gt;ps:  当你创建了一个指针变量之后，输出&amp;amp;b是输出这个变量本身的地址，输出b是输出这个变量里面存放的地址，输出*b是到达这个变量里面存放的地址的空间，然后输出里面的值。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/learning-pointers-C/p06.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/learning-pointers-C/p07.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;那么使用指针还有什么作用呢？拿上述的代码距离，我们可以通过修改*b的值，来改变我们定义的变量a的值，因为我们已经把a的地址存到了b里面了&lt;/p&gt;
&lt;h3 id=&#34;间接引用操作符&#34;&gt;间接引用操作符&lt;/h3&gt;
&lt;p&gt;当我们定义指针变量时，使用的是*b，里面存放的是地址，当我们想要改变里面的地址时，我们是给b赋值(赋的是地址)，而不是给*b赋值, 因为除了&lt;strong&gt;声明指针&lt;/strong&gt;这一场景之外，其他地方的*b代表的是&lt;strong&gt;指针变量里面存的地址指向的值&lt;/strong&gt;,如下图所示，我们可以直接在定义int *b时给指针变量赋值，例如int *b = &amp;amp;a  也可以像下图一样给b赋值。&lt;/p&gt;
&lt;p&gt;当我们使用printf输出*b时，因为现在b中存放的是a的地址，所以*b指的是a的地址里面存放的值，也就是变量a的值&lt;/p&gt;
&lt;p&gt;这里我们可以得到指针的另一个作用，改变其他变量的值, 如下图所示，当我们将*b赋值为5时，同时变量a的值也会跟着变化&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/learning-pointers-C/p08.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;指针与数组&#34;&gt;指针与数组&lt;/h3&gt;
&lt;p&gt;当我们获取一个数组的地址时，返回的是数组中第一个数据的地址&lt;img src=&#34;https://img.echotox.com/article/learning-pointers-C/p09.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;结构体与指针&#34;&gt;结构体与指针&lt;/h2&gt;
&lt;p&gt;结构体是一个或多个变量的集合，这些变量可以是不同的类型（跟java当中的类有点类似，只是没有类中的各种方法）&lt;/p&gt;
&lt;h3 id=&#34;结构体的定义&#34;&gt;结构体的定义&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;结构体名字&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;err&#34;&gt;数据类型&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;变量名&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;err&#34;&gt;数据类型&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;变量名&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tagtax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;结构体的初始化&#34;&gt;结构体的初始化&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;struct 结构体名 变量名;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;struct tagtax t1;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;简化结构体的初始化&#34;&gt;简化结构体的初始化&lt;/h3&gt;
&lt;p&gt;当我们每次初始化结构体时，都要写struct，但我们可以在定义结构体时使用typedef关键字来解决&lt;/p&gt;
&lt;p&gt;可以写成:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;typedef&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;结构体名字&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;err&#34;&gt;数据类型&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;变量名&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;err&#34;&gt;数据类型&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;变量名&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;结构体别名&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;也可以写成:   (为什么我们可以省略结构体名字呢？因为之后我们初始化结构体都是用的它的别名，不会用到结构体名字)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;typedef&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;err&#34;&gt;数据类型&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;变量名&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;err&#34;&gt;数据类型&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;变量名&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;结构体别名&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例如:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;typedef&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tagtax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这时候的初始化:    (没有前面的struct嘞)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;tagtax&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;声明结构体类型的指针&#34;&gt;声明结构体类型的指针&lt;/h3&gt;
&lt;p&gt;当我们定义了一个结构体，并声明（初始化）一个结构体指针, 那么我们如何给它里面的变量赋值呢?&lt;/p&gt;
&lt;p&gt;如下面的代码，我们可以用(*t1).a = 1;来进行赋值&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt;&lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt;&lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt;&lt;span class=&#34;cpf&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;typedef&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;struct&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kt&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tagtax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(){&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;tagtax&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;&amp;#39;k&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在C语言中，我们可以简写这一赋值方式，使用箭头进行赋值&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;t1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;t1&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;&amp;#39;k&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;动态分配内存&#34;&gt;动态分配内存&lt;/h2&gt;
&lt;p&gt;为什么我们需要动态分配内存呢？&lt;/p&gt;
&lt;p&gt;平常我们写代码时，例如声明一个int a = 1;这时候系统会为我们这个变量自动分配一块空间，用完了不用之后自动给我们释放，我们自身不能控制什么时候给我们这个变量分配一块空间，什么时候释放这块空间，但有了动态分配内存，我们就能自己来决定什么时候分配和什么时候释放&lt;/p&gt;
&lt;p&gt;在C语言中，我们会使用malloc函数来动态分配内存，使用free函数来释放内存&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/learning-pointers-C/p10.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;我们通过malloc分配内存空间，因为这里存的是int类型的数据，所以要在前面进行一次强制转换，这样就能给a指针变量分配一份4个字节的int类型的地址&lt;/p&gt;
</description>
    </item>
    <item>
      <title>"第二课堂"竞赛记录</title>
      <link>https://echotox.com/posts/second-classroom-competition-record/</link>
      <pubDate>Wed, 19 Mar 2025 00:00:00 +0000</pubDate>
      <guid isPermaLink="true">https://echotox.com/posts/second-classroom-competition-record/</guid>
      <description type="html">&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;在大二来到新校区之后，开学的一次“第二课堂”竞赛的颁奖仪式让我了解到我们学校还有这个比赛，但当时只是浅浅知道，并没有十分在意，没想到现在，我变成了这一比赛的参赛者。ps:下面是竞赛的部分简介:)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/Second-Classroom-competition-record/p1.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;开发前&#34;&gt;开发前&lt;/h2&gt;
&lt;p&gt;在班上同学txq的邀请下，我迷迷糊糊地加入了一个队伍，当时也不知道到底要干什么，做什么，一切都没有概念，全是空白。&lt;/p&gt;
&lt;p&gt;之后，在某一次ACM协会举办的算法讲解课的活动中，txq对我说可以做一个关于养老方面的项目，并讨论出了这个选题的可行性，能够在技术之外升华主题（也就是打感情牌吧0.0）之后我们便确定了下来，团队成员有我，txq和zy。在这之后，txq提出了加入另外两个外班学生的想法，我没多想也就答应了。&lt;/p&gt;
&lt;p&gt;在进行开发前，我的脑袋还是没有任何的思绪，不知道该从何入手，直到我的一位朋友cjx跟我谈论了他们需要完成的&amp;quot;导师制&amp;quot;项目，我感觉有了一点眉目，看着他的这个项目，我想着，能不能简化他项目的要求，做一个老人预约志愿者的小程序，虽然两个项目天差地别，但他们的逻辑是相通的，都是小程序端用户下单，后台进行管理。同时这一“导师制”也让我了解到了我该用哪些技术栈进行开发，对我帮助很大:)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/Second-Classroom-competition-record/p2.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;开发中&#34;&gt;开发中&lt;/h2&gt;
&lt;h3 id=&#34;寒假125-221&#34;&gt;寒假(1.25-2.21)&lt;/h3&gt;
&lt;p&gt;转眼就到了寒假，寒假之初，我的想法是这一个多月，搭建个人博客，搞定第二课堂项目，搞定数据结构课程，为寒假的算法学习作铺垫，现在看来还是想的太美好了:(&lt;/p&gt;
&lt;p&gt;在寒假过了两周之后，我们便开启了第一次会议，来讨论整个项目。通过在excalidraw上面的分工和讨论，我们初步确定了技术栈，并且确定了对应任务的人员分配（虽然那时已经确定好了，但我并不放心另一位外班同学小程序端的搭建，因为并不是很了解他）&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/Second-Classroom-competition-record/p3.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;在这次会议之后，我每天的日常就是捣鼓搭建个人博客相关的知识，没事看看其他人的博客，做做算法题，偶尔学习一下做第二课堂项目需要的技术，看看《行尸走肉》（我发现越到后面越没有之前好看了0.0）这次寒假对于游戏，我却破天荒地很少玩儿，当朋友叫我去玩游戏时，我大多数情况都是拒绝，当时的心境是感觉打游戏就是有股罪恶感，不打游戏就觉得自己能好好学了（实际上寒假并没有因为少打游戏而提高学习的效率0.0），现在看来，感觉是一种自我欺骗吧。但现在确实对游戏的兴趣没有以前那么大了，更多的时候只是想把它作为与朋友一起玩耍的载体。&lt;/p&gt;
&lt;p&gt;等到过完年之后，我们的专业课老师在线上会议提醒我们要抓紧时间制作项目，这时我才猛然意识到，我们的时间好像已经不是很多了。在这之后，我便以maven到mybatis再到springboot这一学习路线进行系统地学习，整个学习过程都是在与自己的惰性对抗，三四个小时的maven课程我居然花了两三天才完全看完，虽然我的进度如此缓慢，但我好像并没有感到太过于慌张。与此同时，我也没怎么去过问做小程序端的外班同学的进度。（因为与他不熟，所以也没去怎么沟通，现在看来，这是一个十分大的错误）&lt;/p&gt;
&lt;p&gt;在开发过程中，接口的开发一路顺风，虽然完全不知道整个流程的原理，但是还是勉强能知道该如何去使用和编写的:( 在之后的会议上，我们团队又讨论了需要哪一些界面，哪一些接口。通过这几次会议，让我对小程序前端开发的同学偏见越来越大。总觉得他是在用ai编写的，并且对于接口这一块的需求也模糊不清，让我感到了十分不信任（虽然但是，我当时并没有明确指出他的问题，而是选择了逃避和不作为，但明明这是需要我们共同努力而做成的项目，我却选择了现在看来，最令自己不满的解决方法——不去解决）&lt;/p&gt;
&lt;p&gt;寒假的开发很快就过去了，通过zy提供的需求文档，我编写了对应了接口，但对于小程序端，因为具体的操作逻辑和需求都还没有沟通好，所以并没有怎么去编写。&lt;/p&gt;
&lt;h3 id=&#34;开学222-36&#34;&gt;开学(2.22-3.6)&lt;/h3&gt;
&lt;p&gt;开学之后，真正的痛苦才刚刚开始。一开始我们都以为接口参数的传递和调用是不需要花费很大的功夫的，但因为我和zy并没有提前约定好变量名和各种各样其他的东西，导致我们总是不断发现一些小错误，不断修改:( 并且由于对小程序端组员的不信任，我决定自己使用cursor来开发小程序前端的页面。刚开学的这一两周几乎每天都要去图书馆肝不知道多少个小时，晚上睡觉也睡得晚，一开学就感受到了巨大的压力。过程中总是会遇到各种各样的问题，在实现第三方api调用时也错误百出。这让我那段时间的心情也略微有一点点沮丧。&lt;/p&gt;
&lt;p&gt;好在在初赛前，我们基本完成了整个项目，并因为gdd的中途加入，为我们分担了很大一部分事情，从文档到视频制作都由她来完成，最终我们提交了初赛的项目相关文件，获得了一点点喘息的机会。&lt;/p&gt;
&lt;h2 id=&#34;开发后&#34;&gt;开发后&lt;/h2&gt;
&lt;h3 id=&#34;初赛37&#34;&gt;初赛(3.7)&lt;/h3&gt;
&lt;p&gt;在几天之后，我们收到了入围决赛的消息，入围的6个队伍中只有我们是23级的，在当时让我感受到了几秒钟的高兴，之后便又充满了决赛之前要做些什么准备的焦虑感。&lt;/p&gt;
&lt;p&gt;在这之后，因为团队人员的一些事情，产生了许多比赛之外的事件，这让当时的我又倍感烦躁。现在看来，这些事情的起因很大程度上是因为我的沉默导致的，没有在最开始的时候提出我的疑问和质疑，并且自作主张自顾自地开发并不属于我的小程序端，导致了这样让人两难的局面，我不喜欢我的这种性格，希望后面能改变吧。&lt;/p&gt;
&lt;h3 id=&#34;决赛312&#34;&gt;决赛(3.12)&lt;/h3&gt;
&lt;p&gt;入围决赛之后，我们总体的工作还是比之前轻松了许多，改改ppt，写写稿子，zy对之前项目的一些漏洞进行了完善。gdd也把宣传视频进行了改良，用更好的AE制作。&lt;/p&gt;
&lt;p&gt;到了决赛那天，因为周三的晨课和前一天凌晨稿子的编写，让我的状态并不是很好（太困了0.0）最终在那一天的下午，我们来到了决赛的现场，在临近开始的十几分钟，我感觉整个人都十分地紧张。我因为担心观看他人项目之后压力倍增，所以决定选择第一个进行答辩。但当我站上台之后，我感觉我并没有我想象中的紧张感，麻木感，而是变得十分平静，或许是因为我拿着稿子没有脱稿，或许是因为这个决赛场地并没有我想象中的那么高档（我一开始还以为是报告厅那种呢0.0）。即使我内心波澜并不是很大，但我在台上时依旧能感觉得到我讲的很烂:( 在zy上台答辩之后，我在台下拿着稿子，脑袋一片空白，周围的声音也变得十分模糊。（之后进来了一位老师看到我站在那里，还以为我是决赛的主持人，来询问我一些事情，简直太尴尬了- -）最后我以一段十分中二的话结尾，在这之前我觉得这句话很尴尬，但当我真正上台说出去的时候，我的内心只想到了我们的努力和付出，尴尬的心理已经被抛之远去了。(下面这几句话0.0)&lt;img src=&#34;https://img.echotox.com/article/Second-Classroom-competition-record/p4.jpg&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;当我们结束了答辩，在台下时，我的心中感受到了前所未有的轻松，这时我并不想知道，也并不在乎我们最后的排名，只是想着终于结束了这一长达一两个月的项目开发。但当主持人公布前三个作品的分数时（87.4、85.6、82.2 ）我又感到了十分惊喜，这是我又变得十分在乎我们最终的结果了（太贪婪了0.0）当最后三个作品分数公布时（80、83.4、74.2）我的内心感受到了十分强烈的喜悦，即使有因为我们是23级的分数优势，但最终付出的努力被认可时，当我们“以下犯上”超越了22级时，心中的欢喜一下就迸发了出来:)&lt;/p&gt;
&lt;p&gt;虽然我们经历了迷茫的开始，曲折的过程，但最终获得了属于我们的美好结局:)&lt;/p&gt;
&lt;h3 id=&#34;决赛结果公示314&#34;&gt;决赛结果公示（3.14）&lt;/h3&gt;
&lt;p&gt;当决赛结果公示的时候，我们却破天荒地发现我们是二等奖(虽然在公示前txq应该在综合部提前看到信息，知晓是二等奖了，但真正公示下来的时候，还是有点失落)，之后这天的下午，我便去找相关的负责人去反映，结果得来的反馈是“因为移动应用赛道的参赛作品过少，拉通下来一二三等奖按照比例分配的话，移动应用赛道最高也只是二等奖” “我们做不到绝对的公平，你可以提意见下次我们改正” 听到这些话之后，心中感觉很别扭，赛前不说清楚，赛后临时改变评奖规则的这种事情太令人恶心了，公示也是一个虚假的摆设。这让我们的心中充满了遗憾。&lt;/p&gt;
&lt;h3 id=&#34;颁奖仪式319&#34;&gt;颁奖仪式（3.19）&lt;/h3&gt;
&lt;p&gt;在今天上午颁奖之时，当我提前到达了报告厅，看到我们的作品在大屏幕上播放，我的心中产生了五味杂陈的感情，或许是因为被认可，或许是因为我们的东西被其他人所关注，所看见。这时我心中的感受比我站在领奖台上要强烈的多（站在台上毫无波澜0.0）同时在与旁边的wh交谈时，他告诉我他的游戏赛道获奖作品（二等奖）是大二寒假“口袋方舟训练营”做的一个游戏。当我得知这样都能获得二等奖的时候，我想到之前负责人说的那些推脱责任的话语，我就感觉十分可笑。这时我只觉得这个比赛配不上我们的付出，我相信未来我们能做出更好的作品。&lt;/p&gt;
&lt;h2 id=&#34;后记&#34;&gt;后记&lt;/h2&gt;
&lt;p&gt;回顾整个作品的制作，当初许许多多麻烦的问题，现在看起来，只是一些小波折罢了。人总是贪婪的，虽然这次获得了第二课堂竞赛的&lt;del&gt;壹等奖&lt;/del&gt;二等奖，但仔细想想，这不就是一个校级甚至院级的普通比赛吗？我想要获得更多的成就，更多的成绩，想要获得更好的未来。尽管这条道路目前是曲折和让人迷茫的。我想要提升自身，但又害怕孤独，总是会有一种无力感和迷茫感。我很感谢zy，我觉得在她身上我能看到“向上”，看到“追求”，给予了我很大的力量，在此之前，我总觉得自己是孤独的，疲惫无力的，总感觉自己学的很无力，学的很迷茫，但从上学期期末到现在，在与她的交流中，我觉得我有了动力，让我明白我并不是孤身一人，并不孤单。同时我也很庆幸有cjx这一个朋友，尽管相距很远，但我们都学着差不多的专业，所以我们也能相互交流，相互学习。最后感谢我们这一团队的每一个人。&lt;/p&gt;
&lt;p&gt;希望之后我能理清混乱迷茫的自己，朝前努力吧&lt;/p&gt;
</description>
    </item>
    <item>
      <title>Hexo博客网站搭建记录</title>
      <link>https://echotox.com/posts/blog-building-hexo/</link>
      <pubDate>Wed, 29 Jan 2025 00:00:00 +0000</pubDate>
      <guid isPermaLink="true">https://echotox.com/posts/blog-building-hexo/</guid>
      <description type="html">&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;
&lt;p&gt;在这学期期末做JAVA实训项目，去CSDN上查询相关资料的时候，我无意间看到了在文章资料底部，作者留下了自己的个人网站，当时打开之后就感觉好cool😎，就想着趁着寒假，也要做一个自己的博客网站。以下是我搭建网站时，通过观看不同的视频教程，文章教程总结而成的文章，希望帮助自己理解的同时也能帮助其他人搭建博客，如有问题欢迎在评论区指出:）&lt;/p&gt;
&lt;h2 id=&#34;一服务器与域名的购买与设置&#34;&gt;一.服务器与域名的购买与设置&lt;/h2&gt;
&lt;h3 id=&#34;服务器的设置&#34;&gt;服务器的设置&lt;/h3&gt;
&lt;p&gt;阿里云，腾讯云，百度云&amp;hellip;&amp;hellip;.  &lt;a href=&#34;https://cloud.tencent.com/&#34;&gt;腾讯云 产业智变·云启未来 - 腾讯&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p01.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;并记住登录系统的用户名与密码&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p02.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;域名的设置&#34;&gt;域名的设置&lt;/h3&gt;
&lt;p&gt;首先需要对域名进行解析，进入控制台，点击域名注册&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p03.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;在“我的域名”导航栏中，点击解析&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p04.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;按照如下勾选进行解析，网站IP填写服务器的外网IP，到此解析成功 :)&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p05.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;域名ssl证书申请&#34;&gt;域名SSL证书申请&lt;/h3&gt;
&lt;p&gt;在控制台中搜索SSL证书，申请免费证书&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p06.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;申请完毕之后选择下载，并下载此项证书，后面会用到pem文件和key文件&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p07.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;二安装xshell与xftp&#34;&gt;二、安装Xshell与Xftp&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.xshell.com/zh/free-for-home-school/&#34;&gt;家庭/学校免费 - NetSarang Website&lt;/a&gt;   名称随便填，主机选择服务器外网ip,Xftp的连接方式类似&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p08.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;三宝塔面板的安装与配置&#34;&gt;三、宝塔面板的安装与配置&lt;/h2&gt;
&lt;h3 id=&#34;安装宝塔面板&#34;&gt;安装宝塔面板&lt;/h3&gt;
&lt;p&gt;在连接好的xshell中输入命令&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p09.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;输入以下代码&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh &amp;amp;&amp;amp; bash install_panel.sh ed8484bec
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;将会得到以下信息&lt;/p&gt;
&lt;p&gt;========================宝塔面板账户登录信息==========================&lt;/p&gt;
&lt;p&gt;【云服务器】请在安全组放行 aaa 端口(具体端口看你自己的面板)
外网面板地址: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
内网面板地址: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
username: xxx
password: xxxxxxxxx&lt;/p&gt;
&lt;h3 id=&#34;为宝塔面板放行aaa端口&#34;&gt;为宝塔面板放行aaa端口&lt;/h3&gt;
&lt;p&gt;进入服务器控制台，按照画线规则来添加一条规则,放行端口&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p10.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;进入宝塔面板进行配置&#34;&gt;进入宝塔面板进行配置&lt;/h3&gt;
&lt;p&gt;在浏览器中输入外网面板网址进入宝塔面板,选择如下套件，等待安装&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p11.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;在宝塔面板中选择网站这一栏，并按照下图设置添加站点&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p12.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;点击SSL证书，此操作会用到之前在腾讯云申请的证书，用记事本打开下载好的key和pem文件，复制粘贴到其中&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p13.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;四将hexo安装到服务器前的配置&#34;&gt;四、将HEXO安装到服务器前的配置&lt;/h2&gt;
&lt;p&gt;在安装hexo之前，需要安装nodejs，git&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p14.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;安装nodsjs&#34;&gt;安装nodsjs&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://nodejs.cn/download/&#34;&gt;下载 | Node.js 中文网&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p15.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;打开之前下载的Xftp,按照xshell类似的方法进行服务器的连接,找到你的nodejs压缩包，双击它，进行传输，注意右边目录选择root&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p16.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;传输完成之后打开xshell，连接服务器，在命令窗口中输入如下代码，进行解压操作&lt;/p&gt;
&lt;p&gt;(注意这里的node-v22.13.0-linux-x64.tar.xz代表的是你自己下载的，可能与我的版本不同，可以自己更改)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;tar -vxf node-v22.13.0-linux-x64.tar.xz   
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;接下来设置软链接，输入如下代码&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ln -s ~/nodejs/bin/node /usr/local/bin/
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ln -s ~/nodejs/bin/npm /usr/local/bin/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;接下来验证是否安装成功,分别输入如下代码&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;node -v
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;npm -v
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;出现版本号代表安装成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p17.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;接下来更换npm源，官方的源下载速度很慢，可以用国内的源，输入如下代码&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;npm config set registry https://registry.npmmirror.com
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;安装git&#34;&gt;安装git&lt;/h3&gt;
&lt;p&gt;安装前在xshell中输入git -v来检验是否有git，如果没有再进行以下步骤&lt;/p&gt;
&lt;p&gt;首先更新一下软件包(适用于debian和unbantu)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;apt-get update
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;安装git&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;apt-get install git
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;安装hexo脚手架，并设置软连接，依次输入以下代码&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ln -s ~/nodejs/bin/hexo /usr/local/bin/
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hexo -v
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;创建blog文件夹&#34;&gt;创建blog文件夹&lt;/h3&gt;
&lt;p&gt;之后打开xftp，连接上自己的服务器，在箭头指向的框中输入/，进入到root的上一级目录，并创建一个名为blog的文件夹&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p18.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;五vscode的安装与使用&#34;&gt;五、vscode的安装与使用&lt;/h2&gt;
&lt;h3 id=&#34;安装vscode与相应的插件&#34;&gt;安装vscode与相应的插件&lt;/h3&gt;
&lt;p&gt;&lt;a href=&#34;https://code.visualstudio.com/&#34;&gt;Visual Studio Code - Code Editing. Redefined&lt;/a&gt;   在拓展中搜索SSH，安装Remote-SSH（为了远程连接我们的服务器，方便管理）&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p19.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;获得ssh公钥和密钥&#34;&gt;获得ssh公钥和密钥&lt;/h3&gt;
&lt;p&gt;点击win+r键，输入cmd，打开命令行&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p20.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;在命令行中输入如下代码，一路回车，获得本机的ssh公钥和密钥&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ssh-keygen -t rsa
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;接着在电脑的这个目录下面就会生成两个文件（后面会用到id_rsa.pub文件）&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p21.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;接着打开xshell，连接服务器，同样输入上述代码，一路回车&lt;/p&gt;
&lt;p&gt;之后打开xftp，在框中输入/root/.ssh点击回车，进入.ssh文件夹&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p22.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;把之前在电脑上生成的id_rsa_pub文件用记事本打开，复制里面的文本，之后右键authorized_keys文件，选择用记事本编辑，粘贴复制的文本&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p23.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h3 id=&#34;用vscode连接服务器&#34;&gt;用vscode连接服务器&lt;/h3&gt;
&lt;p&gt;按照下图进行操作&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p24.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p25.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p26.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;在配置文件中加入一行 IdentityFile, 后面的路径选择之前在电脑上生成ssh密钥的路径，填写完毕之后按ctrl+s保存&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p27.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;接着连接服务器，并打开blog文件夹&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p28.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;接着在终端中输入hexo init到此结束，连接完毕！&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p29.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;在终端中输入&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hexo cl
hexo g
hexo s
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;并打开给出的网址，即可查看是否安装成功&lt;/p&gt;
&lt;h3 id=&#34;主题安装与使用anzhiyu&#34;&gt;主题安装与使用(anzhiyu)&lt;/h3&gt;
&lt;p&gt;参考&lt;a href=&#34;https://docs.anheyu.com/&#34;&gt;安知鱼主题官方文档 | 一个简洁、美丽的静态hexo主题&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;六修改网站目录和运行目录&#34;&gt;六、修改网站目录和运行目录&lt;/h2&gt;
&lt;p&gt;打开宝塔面板&lt;/p&gt;
&lt;p&gt;接着进入自己的网址，即可看到安装成功！&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p30.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://img.echotox.com/article/blog-building-Hexo/p31.png&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>
