-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
86 lines (49 loc) · 31.4 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>宇泽的BLOG</title>
<link href="http://yuze98.wang/atom.xml" rel="self"/>
<link href="http://yuze98.wang/"/>
<updated>2021-01-05T14:23:11.928Z</updated>
<id>http://yuze98.wang/</id>
<author>
<name>Yuze Wang</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>对于信息熵的本质,我的一些看法</title>
<link href="http://yuze98.wang/2021/01/04/%E8%B0%88%E8%B0%88%E5%AF%B9%E4%BF%A1%E6%81%AF%E7%86%B5%E6%9C%AC%E8%B4%A8%E7%9A%84%E7%90%86%E8%A7%A3/"/>
<id>http://yuze98.wang/2021/01/04/%E8%B0%88%E8%B0%88%E5%AF%B9%E4%BF%A1%E6%81%AF%E7%86%B5%E6%9C%AC%E8%B4%A8%E7%9A%84%E7%90%86%E8%A7%A3/</id>
<published>2021-01-04T15:33:02.000Z</published>
<updated>2021-01-05T14:23:11.928Z</updated>
<content type="html"><![CDATA[<h1 id="一、序言"><a href="#一、序言" class="headerlink" title="一、序言"></a>一、序言</h1><p> 初次看到信息熵的公式有很多不理解的地方,只知道信息熵如何进行计算,却不懂得公式背后的原理,我通过查阅了一些资料,加深了对信息熵的理解,现在将这些理解分享给大家。如有疑问欢迎评论,若对你有帮助,麻烦点个赞。未经允许、请勿转载。(本文适合只知道信心熵的公式,但是不明白其中原理的人进行阅读)</p><h1 id="二、什么是信息熵"><a href="#二、什么是信息熵" class="headerlink" title="二、什么是信息熵"></a>二、什么是信息熵</h1><p> 正如我们想要衡量某个物体的质量引入了克这个单位、我们想衡量时间,我们设计一秒钟这么长。香农老人家想要量化一条消息中带有的“信息量”的大小,提出了信息熵。<br>那么,首先明确一个问题,什么样的消息算作“信息量大”呢?什么样的消息又算作“信息量小呢”?举个例子昨天小明和我说:“今天罗志祥又和周扬青秀恩爱了!”,我就觉得这有啥的,他们天天秀恩爱。也就是说小明的这条消息并不能给我带来很大的信息量。<br> BUT今天小明和我说:”周扬青怒锤罗志祥!!!罗志祥人设崩塌!!!“,我就会很惊讶,因为这条消息给我的信息量很大。(类似的信息量很大的消息还有,小明告诉我今天太阳会从西边升起)<br><strong>我们用信息熵来描述一个事件混乱程度的大小(一个事件我们一定知道结果,那么这个事件的混乱程度就是0;一个时间充满随机性,我们猜不到或者很难猜到结果,那么他的混乱度就很大)</strong><br>引用下面一个在箱子里面摸球的例子,我们来更具体的了解信息熵。<br>(此例引自:<a href="https://www.youtube.com/watch?v=ErfnhcEV1O8">Youtube的一个视频</a>)<br><img src="https://img-blog.csdnimg.cn/20200423164849928.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NjI0MDMw,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><a id="more"></a><p>图左侧中有一个装有四个球的封闭箱子(这个箱子里面有三个红球、一个蓝球),现在我们从箱子中随机取出一个球,记录它的颜色后再放回箱子中,重复四次操作。如果你依次取出的序列为右上角所示(第一次取到红色、第二次取到红色、第三次取到红色、第四次取到蓝色),则你可以获得奖金;否则你就输了。大家用初中数学来算一算,我赢得奖金的概率是</p><script type="math/tex; mode=display">P(x)=\frac{3}{4}*\frac{3}{4}*\frac{3}{4}*\frac{1}{4}=\frac{27}{256}</script><p>  现在明确了这个游戏的规则,那么我们分析一下如下几个箱子和获胜概率<br><img src="https://img-blog.csdnimg.cn/20200423165753935.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NjI0MDMw,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br><img src="https://img-blog.csdnimg.cn/20200423165836890.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NjI0MDMw,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br><img src="https://img-blog.csdnimg.cn/20200423165853642.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NjI0MDMw,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>(每个图的左边是这个箱子的红球与蓝球初始条件,右侧是获胜所要求的序列,大家自己算算这个概率和图上写的一样吗?)<br><img src="https://img-blog.csdnimg.cn/20200423170009974.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NjI0MDMw,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br>我们来分析一下这三种状态的游戏,第一次由于箱子内全是红球、该箱子的随机性很弱,也就是说带来的信息量很小;第三个箱子随机性很强,也就是说带来的信息量很大。也就是说,我们算出的这个概率越接近1时候,这个信息熵应该越接近0;算出的这个概率越小的时候,信息熵反而应该越大。我们需要找到这么一个公式来满足这一点。(暂停思考一下,有哪些公式可以满足)<br> <strong>该可以很轻松的想到,用刚才P(winning)的概率取倒数可以吗?</strong> 答案是,只考虑刚才的问题,是可以的。但取倒数这个方式还是存在一些问题,比如第三个箱子取0.0625的倒数,算出来的这个信息量为16,如果这个P(winning)概率算出结果很小时,取倒数后就会变得非常大,所以我们认为这个乘法的规则并不是很好。香农发现log函数可以很好的解决这个问题。 因为log(a<em>b) = log(a)+log(b);而恰巧像抽箱子的独立事件P(AB) = P(A)</em>P(B)。【原因不止于此,后面我们还会再详细讨论】。<br>所以香农取了一个-log(x)这么一个函数来表示某一状态的信息量大小,因为x是概率事件取[0,1],所以log(x)是一个递增的恒负的值,取一个负号,-log(x)是一个恒正、递减的函数,正好符合我们的预期。<br><img src="https://img-blog.csdnimg.cn/2020042410083693.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NjI0MDMw,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><p>表的第四列就是我们用log计算出的结果。而我们刚刚是依次计算的每一个球的结果,为了表示系统的平均信息量。我们除4得到最终的信息熵。<br><img src="https://img-blog.csdnimg.cn/20200424093452775.png" alt="在这里插入图片描述"><br>我们来将这个模型一般化,m个红球n个蓝球,信息熵表示如上图所示。<br>我们可以再将模型一般化一些,如果这个箱子里有多种不同颜色的球,我们就公式变成了如下的样子:</p><script type="math/tex; mode=display">H_{(x)}= -\sum_{i=1}^{n}P_{(x_i)}*log(P(x_i))\,</script><p>这就是信息熵。<strong>也就是说,我们规定拿出一枚硬币,随意投出后,他可能是正面也可能是反面,它的信息熵是单位1(用刚才的方法来算算是不是1)。就像我们在这节开始所提到的,我们知道一个物体是几千克。是因为我们有一个1kg的砝码作为参考。我们能感受到时间流逝了多少秒,是因为我们规定了秒的单位。</strong></p><h1 id="三、为什么是log"><a href="#三、为什么是log" class="headerlink" title="三、为什么是log"></a>三、为什么是log</h1><p> 这章我们会再用一个例子来讲解,为什么是信息熵为什么要用log?还是以一个游戏为例。<img src="https://img-blog.csdnimg.cn/20200424094021662.png" alt="在这里插入图片描述"><br>在上述的8个字母中,任取一个字母(我们不知道取的是什么,但我们知道初始的8个字母是什么),现在让你来猜这个字母是什么。<br>利用我们刚刚学过的信息熵,我们可以知道第一个序列的信息熵很低、第三个最高。我们可以计算出如下结果<br><img src="https://img-blog.csdnimg.cn/20200424094310473.png" alt="在这里插入图片描述"><br>(这个信息熵大家自己算一下,和上面计算的方式完全一样)<br><strong>重点来了:</strong> 下面我们用一种提问的方式,来解决这个问题。你可以像系统提问(比如:这个字符是A吗?),系统会给你回答,你根据回答继续进行提问,直到猜到结果为止。以第二个序列为例;系统选了D,让你来猜。你会这样提问:<br><em>Q1:这个字符是A吗? Answer:不是</em><br>你就知道,这个答案只能是B,C,D中的一个,你就会继续提问:<br><em>Q2:这个字符是B吗? Answer:不是</em><br>你就会继续问:<br><em>Q3:这个字符是C吗?Answer:不是</em><br>好了,你不会再继续问下去了,因为这个答案一定是D。<br>也就是说通过这种方式,如果答案是A,你会猜1次,答案是B你会猜两次,答案是C或者D,你会猜三次。平均猜测次数为</p><script type="math/tex; mode=display">E(x)=\frac{1}{4}*1+\frac{1}{4}*2+\frac{1}{4}*3+\frac{1}{4}*3=2.25次</script><p>显然,你可以选择一种更精妙的提问方式,来缩减平均猜测的次数<br>你可以这样进行提问:<br>Q1:这个字符是A或B吗? Answer:不是<br>Q2:那么这个字符是C吗? Answer:不是<br>好了,那么我知道这个字符是D了。也就是通过这种方式,我们不管是哪一个字符,我们只需要问两次就可以解决问题,我们用一种更直观的树来表示,如下图所示<br><img src="https://img-blog.csdnimg.cn/20200424101310790.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NjI0MDMw,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"><br><strong>恰巧,这种提问二选一的过程,恰巧是个抛硬币的过程。由于我们类似的等价于抛了两次硬币,我们可以知道,这个过程的信息熵是2。我们再用信息熵的公式试一试</strong></p><script type="math/tex; mode=display">H(x)=\frac{1}{4}*log(4)+\frac{1}{4}*log(4)+\frac{1}{4}*log(4)+\frac{1}{4}*log(4)=2</script><p>(这里我们把符号直接化进log中了)</p><p><strong>大家发现没有,log(x)是不是恰巧等于x需要询问的次数呢?!!!这也是这个公式的精妙所在,在离散数学中我们学过,一个树的高度等于log(节点数),这个log(x)恰巧是询问的高度,也就是投硬币的次数!这原来就是使用log的原因</strong><br>上面的例子中A,B,C,D都是等概率出现的;下面我们将这个过程一般化,看一看当每个随机变量不等概率时的运算过程<br><img src="https://img-blog.csdnimg.cn/20200424102401714.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NjI0MDMw,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p><p>我们看如上的序列,其中A出现的概率要等于BCD之和。所以我们为了让我们的提问次数最小化,我们要尽力讲每次提问的YorN分成等概率,也就是我们要问的第一个问题是:<br><em>Q1:这个字符是A吗?</em><br>如果不是,我们知道是B,C,D但是B的概率等于C和D之和,我们就再问:<br><em>Q2:这个字符是B吗?</em><br>如果不是,这时候C和D等概率,我们随便问一个即可:<br><em>Q3:这个字符是C吗?</em><br>好了,现在得出了结论。<br>问出A需要1次,B2次,C和D都是三次。<br>我们用信息熵来计算一下。</p><script type="math/tex; mode=display">H(x)=\frac{1}{2}*log(2)+\frac{1}{4}*log(4)+\frac{1}{8}*log(8)+\frac{1}{8}*log(8)</script><p>每一个log(x)恰巧对应着他所在的叶子在树的第几层,也就是他需要询问的次数,前面乘上一个概率,是不是发现这个公式提出的非常巧妙!!<br>.</p><h1 id="三、结语"><a href="#三、结语" class="headerlink" title="三、结语"></a>三、结语</h1><p> 通过上述过程,相信大家能清楚的理解信息熵。本文并没有一些数学上详细的证明,暂时留个坑以后填。如果大家有什么问题,欢迎在评论区交流,如果觉得有用麻烦点个赞~<br>参考资料:<a href="https://www.youtube.com/watch?v=ErfnhcEV1O8">https://www.youtube.com/watch?v=ErfnhcEV1O8</a></p>]]></content>
<summary type="html"><h1 id="一、序言"><a href="#一、序言" class="headerlink" title="一、序言"></a>一、序言</h1><p>&nbsp;&nbsp;&nbsp;&nbsp;初次看到信息熵的公式有很多不理解的地方,只知道信息熵如何进行计算,却不懂得公式背后的原理,我通过查阅了一些资料,加深了对信息熵的理解,现在将这些理解分享给大家。如有疑问欢迎评论,若对你有帮助,麻烦点个赞。未经允许、请勿转载。(本文适合只知道信心熵的公式,但是不明白其中原理的人进行阅读)</p>
<h1 id="二、什么是信息熵"><a href="#二、什么是信息熵" class="headerlink" title="二、什么是信息熵"></a>二、什么是信息熵</h1><p>&nbsp;&nbsp;&nbsp;&nbsp;正如我们想要衡量某个物体的质量引入了克这个单位、我们想衡量时间,我们设计一秒钟这么长。香农老人家想要量化一条消息中带有的“信息量”的大小,提出了信息熵。<br>那么,首先明确一个问题,什么样的消息算作“信息量大”呢?什么样的消息又算作“信息量小呢”?举个例子昨天小明和我说:“今天罗志祥又和周扬青秀恩爱了!”,我就觉得这有啥的,他们天天秀恩爱。也就是说小明的这条消息并不能给我带来很大的信息量。<br> BUT今天小明和我说:”周扬青怒锤罗志祥!!!罗志祥人设崩塌!!!“,我就会很惊讶,因为这条消息给我的信息量很大。(类似的信息量很大的消息还有,小明告诉我今天太阳会从西边升起)<br><strong>我们用信息熵来描述一个事件混乱程度的大小(一个事件我们一定知道结果,那么这个事件的混乱程度就是0;一个时间充满随机性,我们猜不到或者很难猜到结果,那么他的混乱度就很大)</strong><br>引用下面一个在箱子里面摸球的例子,我们来更具体的了解信息熵。<br>(此例引自:<a href="https://www.youtube.com/watch?v=ErfnhcEV1O8">Youtube的一个视频</a>)<br><img src="https://img-blog.csdnimg.cn/20200423164849928.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM1NjI0MDMw,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p></summary>
<category term="理论学习" scheme="http://yuze98.wang/categories/%E7%90%86%E8%AE%BA%E5%AD%A6%E4%B9%A0/"/>
<category term="信息熵" scheme="http://yuze98.wang/tags/%E4%BF%A1%E6%81%AF%E7%86%B5/"/>
</entry>
<entry>
<title>究竟malloc前面和sizeof里面的值到底为什么这么填?(int_)malloc(sizeof(int))</title>
<link href="http://yuze98.wang/2021/01/04/%E7%A9%B6%E7%AB%9Fmalloc%E5%89%8D%E9%9D%A2%E5%92%8Csizeof%E9%87%8C%E9%9D%A2%E7%9A%84%E5%80%BC%E5%88%B0%E5%BA%95%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%99%E4%B9%88%E5%A1%AB%EF%BC%9F(int_)malloc(sizeof(int))/"/>
<id>http://yuze98.wang/2021/01/04/%E7%A9%B6%E7%AB%9Fmalloc%E5%89%8D%E9%9D%A2%E5%92%8Csizeof%E9%87%8C%E9%9D%A2%E7%9A%84%E5%80%BC%E5%88%B0%E5%BA%95%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%99%E4%B9%88%E5%A1%AB%EF%BC%9F(int_)malloc(sizeof(int))/</id>
<published>2021-01-04T15:32:02.000Z</published>
<updated>2021-01-05T14:23:35.734Z</updated>
<content type="html"><![CDATA[<p>    相信很多人有这样的疑问,我们在给指针分配空间的时候常常使用这样的语句:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> *p = (<span class="keyword">int</span>*)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(<span class="keyword">int</span>));</span><br></pre></td></tr></table></figure><p>为什么要在malloc前加上*在sizeof里面不加呢?</p><p>我们先来看一下关于malloc的介绍<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">malloc</span>的全称是memory allocation,</span><br><span class="line">中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以<span class="keyword">void</span>*类型</span><br><span class="line">返回分配的内存区域地址,</span><br><span class="line">当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的</span><br><span class="line">分配内存,且分配的大小就是程序要求的大小</span><br></pre></td></tr></table></figure><br>有一点值得注意,malloc这个函数的返回值为void<em>,而我们上面p定义的变量类型为int</em>,所以需要进行强制转化,所以使用(int*)。</p><a id="more"></a><p>  然后我们可以明确的是我们要申请一块int这么大的内存空间,再使得p指向这个空间,所以很明确的是sizeof(int)这么写是没有问题的。如果写sizeof(int<em>),就会申请int</em>这么大的一块空间。如果你的运行结果没有错,证明机器中int所占的空间大小和int指针型所占的空间大小是相同的。但是你分配char和结构体指针就不会这么幸运了。我们来看一组实验<br>:</p><p>|(int *)malloc(sizeof(int)) | sizeof(int)=4 | int占4个字节 |</p><p>| ———————— | ——————— | ——————————— |<br>|(int *)malloc(sizeof(int*)) | sizeof(int*)=4 | int指针占4个字节 |</p><p>|(char *)malloc(sizeof(char)) | sizeof(char)=1 | char占1个字节 |</p><p>|(char *)malloc(sizeof(char*)) | sizeof(char*)=4 | int占4个字节 |</p><p>仔细看过这个表相信大家应该就明白了吧。如有问题欢迎留言~如果觉得有帮助,点个赞和关注~<br>.</p>]]></content>
<summary type="html"><p> &emsp;&emsp; 相信很多人有这样的疑问,我们在给指针分配空间的时候常常使用这样的语句:</p>
<figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> *p = (<span class="keyword">int</span>*)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(<span class="keyword">int</span>));</span><br></pre></td></tr></table></figure>
<p>为什么要在malloc前加上*在sizeof里面不加呢?</p>
<p>我们先来看一下关于malloc的介绍<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">malloc</span>的全称是memory allocation,</span><br><span class="line">中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以<span class="keyword">void</span>*类型</span><br><span class="line">返回分配的内存区域地址,</span><br><span class="line">当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的</span><br><span class="line">分配内存,且分配的大小就是程序要求的大小</span><br></pre></td></tr></table></figure><br>有一点值得注意,malloc这个函数的返回值为void<em>,而我们上面p定义的变量类型为int</em>,所以需要进行强制转化,所以使用(int*)。</p></summary>
<category term="C语言" scheme="http://yuze98.wang/categories/C%E8%AF%AD%E8%A8%80/"/>
<category term="C语言" scheme="http://yuze98.wang/tags/C%E8%AF%AD%E8%A8%80/"/>
</entry>
<entry>
<title>typedef struct node{}a,_b;到底是什么意思?</title>
<link href="http://yuze98.wang/2021/01/04/typedef%20struct%20node%7B%7Da,_b%EF%BC%9B%E5%88%B0%E5%BA%95%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D%EF%BC%9F/"/>
<id>http://yuze98.wang/2021/01/04/typedef%20struct%20node%7B%7Da,_b%EF%BC%9B%E5%88%B0%E5%BA%95%E6%98%AF%E4%BB%80%E4%B9%88%E6%84%8F%E6%80%9D%EF%BC%9F/</id>
<published>2021-01-04T15:31:02.000Z</published>
<updated>2021-01-05T14:23:52.932Z</updated>
<content type="html"><![CDATA[<p>  很多小伙伴知道 typedef int a;的作用相当于将int 换名为a;<br>也知道typedef struct node{xxx}b;的意思是将这个结构体命名为b;但是对于这样的代码<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">Node</span></span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"> <span class="keyword">int</span> value1;</span><br><span class="line"> <span class="keyword">int</span> value2;</span><br><span class="line">}*p,a;</span><br></pre></td></tr></table></figure><br>确不知道这两个表示的什么。首先我们先明确一个typedef最基本的定义<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="keyword">int</span> a,b;</span><br></pre></td></tr></table></figure><br>上述语句是将a和b同时作为int的名字替换。也就是说我们既可以用a代表int也可以用b代表int。<br> 再看看我们以前对于指针的定义:<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span>* a,b;</span><br></pre></td></tr></table></figure><br>这个语句的意思大家知道吧?是定义一个int*型变量a,定义一个int型变量b;仔细思考一下为什么b定义的是个int类型呢,是因为这个语句也可以等价于如下的语句:<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span>* a;</span><br><span class="line"><span class="keyword">int</span> b;</span><br></pre></td></tr></table></figure><br>也就是说*号是与a作结合的,b不在这个星号的作用域之内。<br><a id="more"></a><br>好了,明确了这两点,我们再回过头来看看最开始的问题<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">Node</span></span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"> <span class="keyword">int</span> value1;</span><br><span class="line"> <span class="keyword">int</span> value2;</span><br><span class="line">}*p,a;</span><br></pre></td></tr></table></figure><br>这个代码是什么意思呢?中间的{}我们先把他遮住,再把这个代码拆开,也就变成了这样<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">Node</span> *<span class="title">p</span>;</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">Node</span> <span class="title">a</span>;</span></span><br></pre></td></tr></table></figure><br>也就是说我们将 struct Node*这个结构体指针类型换名为p,将struct Node 这个结构体换名为a;<br>这时候我们就可以进行如下操作了:</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">p sp;<span class="comment">//sp是个结构体指针类型</span></span><br><span class="line">a s;<span class="comment">//s是个结构体类型</span></span><br><span class="line">sp->value1 = <span class="number">3</span>;<span class="comment">//结构体指针使用间接引用</span></span><br><span class="line">s.value1 = <span class="number">2</span>;<span class="comment">//结构体使用直接饮用</span></span><br></pre></td></tr></table></figure><p>这下大家明白了吧?顺便提醒一下直接执行sp->value1 = 3;这个操作程序会出现错误,因为你并没有给指针分配空间对吧?如果这个不了解的话可以看看这个博客:<br><a href="https://blog.csdn.net/qq_35624030/article/details/104514340">指针能不能不分配空间直接使用?</a></p><h3 id="如果觉得有帮助,点个赞和关注谢谢-如果有这个问题相关的疑问,欢迎在下面留言,我看到后会及时解答并补充博客"><a href="#如果觉得有帮助,点个赞和关注谢谢-如果有这个问题相关的疑问,欢迎在下面留言,我看到后会及时解答并补充博客" class="headerlink" title="如果觉得有帮助,点个赞和关注谢谢~如果有这个问题相关的疑问,欢迎在下面留言,我看到后会及时解答并补充博客~"></a>如果觉得有帮助,点个赞和关注谢谢~如果有这个问题相关的疑问,欢迎在下面留言,我看到后会及时解答并补充博客~</h3>]]></content>
<summary type="html"><p>&emsp;&emsp;很多小伙伴知道 typedef int a;的作用相当于将int 换名为a;<br>也知道typedef struct node{xxx}b;的意思是将这个结构体命名为b;但是对于这样的代码<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">Node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"> <span class="keyword">int</span> value1;</span><br><span class="line"> <span class="keyword">int</span> value2;</span><br><span class="line">&#125;*p,a;</span><br></pre></td></tr></table></figure><br>确不知道这两个表示的什么。首先我们先明确一个typedef最基本的定义<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="keyword">int</span> a,b;</span><br></pre></td></tr></table></figure><br>上述语句是将a和b同时作为int的名字替换。也就是说我们既可以用a代表int也可以用b代表int。<br>&emsp;再看看我们以前对于指针的定义:<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span>* a,b;</span><br></pre></td></tr></table></figure><br>这个语句的意思大家知道吧?是定义一个int*型变量a,定义一个int型变量b;仔细思考一下为什么b定义的是个int类型呢,是因为这个语句也可以等价于如下的语句:<br><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span>* a;</span><br><span class="line"><span class="keyword">int</span> b;</span><br></pre></td></tr></table></figure><br>也就是说*号是与a作结合的,b不在这个星号的作用域之内。<br></summary>
<category term="C语言" scheme="http://yuze98.wang/categories/C%E8%AF%AD%E8%A8%80/"/>
<category term="C语言" scheme="http://yuze98.wang/tags/C%E8%AF%AD%E8%A8%80/"/>
</entry>
</feed>