Skip to content

Commit e002e85

Browse files
committed
Updated to Chapter 5, Section 2
1 parent ae6846e commit e002e85

22 files changed

+462
-69
lines changed

generalized_parts/05_composite_types_and_their_use/01_pointer.tex

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ \subsection*{指针参数传递}
132132
所以在函数参数传递的过程中,程序并没有把``整个变量''传递给目标函数,而只传递了它的``''。至于被调用的那个函数,它会另外定义一个新的变量(它在内存空间中另一自己的一席之地)来接收传入的值。很多资料会把它称为\textbf{副本(Copy)}。\par
133133
\begin{figure}[htbp]
134134
\centering
135-
\includegraphics[width=0.75\textwidth]{../images/generalized_parts/05_process_of_pass_by_reference_300.png}
135+
\includegraphics[width=0.75\textwidth]{../images/generalized_parts/05_process_of_pass_by_value_300.png}
136136
\caption{\lstinline@main@ 向 \lstinline@exchange@ 中传入的信息只有值}
137137
\end{figure}
138138
我们会发现,不同函数之间只能共享值,这种现象好像一种屏障——在某些时候,它显得十分安全,我们不会在一个函数中乱改其它函数中的信息;但在另一些时候,它显得非常不灵活,如果我们用别的函数只能读取而不能修改此函数中的值,函数的功能就会受到很大限制——比如我们试图写一个值交换函数而不能。\par
@@ -190,9 +190,9 @@ \subsection*{指针的运算}
190190
而指针与整型的加/减法是有意义的,尤其是在数组当中。一个指针与整数相加/减,它的返回值是和原来指针相同的类型(比如说,\lstinline@int*@ 与 \lstinline@short@ 相加/减,返回值为 \lstinline@int*@)。\par
191191
\begin{lstlisting}
192192
float f, *pf {&f}; //这里不需要初始化f,因为只需用到其地址,而不需要其值
193-
cout << pf << endl << pf - 1 << endl; //输出pf和pf+1的值,它们都是地址值
193+
cout << pf << endl << pf - 1 << endl; //输出pf和pf-1的值,它们都是地址值
194194
long double ld; //同理,只是改成了long double型
195-
cout << &ld << endl << &ld + 1; //直接输出&ld,效果相同
195+
cout << &ld << endl << &ld + 1; //直接输出&ld和&ld-1,效果相同
196196
\end{lstlisting}
197197
运行结果是这样的\footnote{再次提醒读者,实际输出的内存地址因机而异,我们应当关注的是几个输出地址之间的相互关系。}:\\\noindent\rule{\linewidth}{0.2pt}\texttt{
198198
0x7ffc4bf3837c\\
@@ -204,7 +204,12 @@ \subsection*{指针的运算}
204204
首先输出的两个是 \lstinline@pf@ 和 \lstinline@pf-1@ 的值。从数值上看,前者是 \lstinline@...37c@,而后者是 \lstinline@...378@,后者虽然是 \lstinline@pf-1@,但地址却减小了4个字节。\par
205205
接下来输出的两个是 \lstinline@&ld@ 和 \lstinline@&ld+1@ 的值。从数值上看,前者是 \lstinline@...380@,而后者是 \lstinline@...390@,后者虽然是 \lstinline@&ld+1@,但地址却增加了16个字节。\par
206206
之所以会出现这种情况,关键就在于不同类型数据在内存中占用的字节数目不同。一般说来,\lstinline@float@ 型占据4字节内存空间,而 \lstinline@long double@ 型占据16字节内存空间。\par
207-
指针和整型的加减法并不是单纯地移动多少个字节,而是移动了多少个数据(可以理解为,偏移量乘以单个数据占用的字节数)。这样设计是有它的道理的,等我们讲到数组,读者就会很容易理解了。\par
207+
指针和整型的加减法并不是单纯地移动多少个字节,而是移动了多少个数据(可以理解为,偏移量乘以单个数据占用的字节数),如图5.7所示。这样设计是有它的道理的,等我们讲到数组,读者就会很容易理解了。\par
208+
\begin{figure}[htbp]
209+
\centering
210+
\includegraphics[width=0.7\textwidth]{../images/generalized_parts/05_arithmetic_of_pointer_300.png}
211+
\caption{指针加法运算的偏移量是以数据为单位的,而不是地址值}
212+
\end{figure}
208213
两个同类型指针可以相减,其返回值是一个特殊的类型,叫作 \lstinline@ptrdiff_t@。不过我们也无需纠结这种细节,因为 \lstinline@ptrdiff_t@ 可以隐式类型转换为整型,所以我们可以直接把它当作整型来用,比如输出。
209214
\begin{lstlisting}
210215
int a, b, c;
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
\section{``常量指针''``指向常量的指针''}
2+
我们在前面讲基本数据类型时,曾经用 \lstinline@const@ 限定符来标记一个变量,使之成为常量;或用 \lstinline@constexpr@ 限定符来标记一个变量,使之成为常量表达式。\par
3+
既然指针也是``变量''的一种,那么我们能否用 \lstinline@const@ 或 \lstinline@constexpr@ 来把它们变成常量或常量表达式呢?\par
4+
先说结论:我们可以使用 \lstinline@const@,将指针限定为``常量指针''或者``指向常量的指针''乃至``指向常量的常量指针''。但是我们不能定义成 \lstinline@constexpr@,因为编译器是不可能未卜先知,知道某个变量在运行时的地址。\par
5+
那么什么是常量指针,什么是指向常量的指针呢?本节就来介绍这两个概念。\par
6+
当我们拿到一个没有任何限制的指针时,我们可以对它的指向进行修改——也就是修改这个指针所存储的地址值;我们还可以通过取内容运算符 \lstinline@*@ 来对它的内容进行修改——也就相当于修改对应变量的值,而修改之后这个指针依然指向原来的位置。如图5.8所示。\par
7+
\begin{figure}[htbp]
8+
\centering
9+
\includegraphics[width=0.6\textwidth]{../images/generalized_parts/05_change_pointer_s_address_or_content_300.png}
10+
\caption{修改指针的指向/修改指针的内容}
11+
\end{figure}
12+
我们可以通过 \lstinline@const@ 来限制指针的一部分修改能力,从而将其变为常量指针或指向常量的指针。为了避免在代码上出现误解和混淆,我先介绍概念。\par
13+
\begin{itemize}
14+
\item \textbf{常量指针(Constant pointer)}限制了指针改变指向的能力。这种指针一经初始化,就不能改变指向。但是这不影响我们可以修改它的内容。
15+
\item \textbf{指向常量的指针(Pointer to constant,简称指针常量\footnote{笔者十分不推荐使用``指针常量''这个名字!它极易与常量指针混淆。})}限制了指针改变内容的能力。我们不能用这种指针来改变内容,但是它可以改变指向。虽然名为``指向常量的指针'',但它也完全可以指向变量。如果它指向变量,那么我们可以用变量名来修改内容;但是不能用这个指针来修改内容。
16+
\end{itemize}
17+
我们还可以用更符号化的表述来阐释它们之间的关系:\par
18+
如果 \lstinline@pd@ 是一个常量指针,那么 \lstinline@pd@ 不能改变;但 \lstinline@*pd@ 是有可能改变的。\par
19+
如果 \lstinline@pd@ 是一个指向常量的指针,那么 \lstinline@*pd@ 不能改变;但 \lstinline@pd@ 是有可能改变的。\par
20+
当你理顺了它们的区别之后,我们就来讲讲怎么用 \lstinline@const@ 限定符来把指针限制成常量指针或指向常量的指针。这是定义的语法:
21+
\begin{lstlisting}
22+
const int *ptc1; //定义一个指向常量的指针。它可以改变指向,所以无需初始化
23+
int const *ptc2 {nullptr}; //int与const的位置可互换,也是定义指向常量的指针
24+
int* const cp {nullptr}; //将const置于*之后,定义一个常量指针,必须初始化
25+
\end{lstlisting}
26+
怎么理解这个定义语法,并把这三种看上去非常相像的语法区分开呢?我们可以这样想:\par
27+
\lstinline@const@ 会对它所标记之物作出限制,使其不能改变。如果 \lstinline@const@ 限制的是 \lstinline@p@,那么 \lstinline@p@ 就不可改变,但 \lstinline@*p@ 可以改变——这正是常量指针的特性;如果 \lstinline@const@ 限制的是 \lstinline@*p@,那么 \lstinline@*p@ 就不可改变,但 \lstinline@p@ 可以改变——这正是指向常量指针的特性。\par
28+
回到我们的定义语法。\lstinline@const int *ptc1@ 这里,我们看,\lstinline@const@ 之后的部分除了 \lstinline@int@(这个不用管)就是 \lstinline@*ptc1@,于是 \lstinline@const@ 直接限定了 \lstinline@*ptc1@,所以 \lstinline@*ptc1@ 不可变,而 \lstinline@ptc1@ 可变,所以它是指向常量的指针;\par
29+
\lstinline@int const *ptc2@ 同理,\lstinline@const@ 直接限定了 \lstinline@*ptc2@,所以 \lstinline@*ptc2@ 不可变,而 \lstinline@ptc2@ 可变,所以它也是指向常量的指针;\par
30+
到了 \lstinline@int* const cp@ 这儿,情况有点不太一样。\lstinline@const@ 直接限定了 \lstinline@cp@,所以 \lstinline@cp@ 不可变,而 \lstinline@cp*@ 仍然可变,所以它是常量指针。\par
31+
图5.9可以帮助你梳理它们之间的区别。\par
32+
\begin{figure}[htbp]
33+
\centering
34+
\includegraphics[width=0.7\textwidth]{../images/generalized_parts/05_definition_of_constant_pointer_and_pointer_to_const_300.png}
35+
\caption{\lstinline@const@ 限制了什么?}
36+
\end{figure}
37+
知道了这个语法规则,那么定义一个``指向常量的常量指针''的语法也就很容易理解了:
38+
\begin{lstlisting}
39+
const int* const cptc {nullptr}; //定义一个指向常量的常量指针
40+
\end{lstlisting}
41+
在这里,第一个 \lstinline@const@ 限制了 \lstinline@*cptc@ 不能改变,而第二个 \lstinline@const@ 限制了 \lstinline@cptc@ 不能改变,所以这个指针一经定义,既不能改变指向,也不能改变内容。\par
42+
指向常量的指针常见于函数参数,因为很多时候我们需要限制函数对参数的修改能力,确保有些信息是只读的,以免在函数中不小心修改与参数有关的信息。举例来说,\lstinline@cstring@ 库中有 \lstinline@strlen@ 函数,它可以求出一个字符串\footnote{我们会在后面讲到字符串。}的长度。这个函数的声明格式是
43+
\begin{lstlisting}
44+
std::size_t strlen( const char* str );
45+
\end{lstlisting}
46+
这很好理解。既然它只是求算字符串的长度,那么当然没有必要让它具备修改目标字符串的能力,因此直接定义成指向常量的指针就没有潜在风险了。\par
119 KB
Loading
41.5 KB
Loading
42.8 KB
Loading

images/generalized_parts/05_process_of_pass_by_reference_300.png renamed to images/generalized_parts/05_process_of_pass_by_value_300.png

File renamed without changes.
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<mxfile host="Electron" modified="2023-12-31T00:15:34.785Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/22.1.16 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="lN_M9iTFinUyx_TIMcXn" version="22.1.16" type="device">
2+
<diagram name="Page-1" id="3FU2BRUodX3esNhyQgwJ">
3+
<mxGraphModel dx="674" dy="463" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
4+
<root>
5+
<mxCell id="0" />
6+
<mxCell id="1" parent="0" />
7+
<mxCell id="Rr48j6R8bM0mg8fOzwoo-1" value="内存 Memory" style="swimlane;whiteSpace=wrap;html=1;startSize=30;fillColor=#ffe6cc;strokeColor=#d79b00;" parent="1" vertex="1">
8+
<mxGeometry x="320" y="160" width="160" height="312" as="geometry" />
9+
</mxCell>
10+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-1" value="0x7ffccff275b7" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;fontFamily=consolas;" parent="Rr48j6R8bM0mg8fOzwoo-1" vertex="1">
11+
<mxGeometry x="1" y="250" width="158" height="21" as="geometry" />
12+
</mxCell>
13+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-2" value="&lt;div&gt;0x7ffccff275b8&lt;/div&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;fontFamily=consolas;fontStyle=1" parent="Rr48j6R8bM0mg8fOzwoo-1" vertex="1">
14+
<mxGeometry x="1" y="231" width="158" height="20" as="geometry" />
15+
</mxCell>
16+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-3" value="0x7ffccff275b9" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;fontFamily=consolas;fontStyle=1" parent="Rr48j6R8bM0mg8fOzwoo-1" vertex="1">
17+
<mxGeometry x="1" y="211" width="158" height="20" as="geometry" />
18+
</mxCell>
19+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-4" value="0x7ffccff275ba" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;fontFamily=consolas;fontStyle=1" parent="Rr48j6R8bM0mg8fOzwoo-1" vertex="1">
20+
<mxGeometry x="1" y="191" width="158" height="20" as="geometry" />
21+
</mxCell>
22+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-5" value="0x7ffccff275bb" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;fontFamily=consolas;fontStyle=1" parent="Rr48j6R8bM0mg8fOzwoo-1" vertex="1">
23+
<mxGeometry x="1" y="171" width="158" height="20" as="geometry" />
24+
</mxCell>
25+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-6" value="0x7ffccff275bc" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;fontFamily=consolas;fontStyle=1" parent="Rr48j6R8bM0mg8fOzwoo-1" vertex="1">
26+
<mxGeometry x="1" y="151" width="158" height="20" as="geometry" />
27+
</mxCell>
28+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-7" value="0x7ffccff275bd" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;fontFamily=consolas;fontStyle=1" parent="Rr48j6R8bM0mg8fOzwoo-1" vertex="1">
29+
<mxGeometry x="1" y="131" width="158" height="20" as="geometry" />
30+
</mxCell>
31+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-8" value="0x7ffccff275be" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;fontFamily=consolas;fontStyle=1" parent="Rr48j6R8bM0mg8fOzwoo-1" vertex="1">
32+
<mxGeometry x="1" y="111" width="158" height="20" as="geometry" />
33+
</mxCell>
34+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-9" value="0x7ffccff275bf" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;fontFamily=consolas;fontStyle=1" parent="Rr48j6R8bM0mg8fOzwoo-1" vertex="1">
35+
<mxGeometry x="1" y="91" width="158" height="20" as="geometry" />
36+
</mxCell>
37+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-10" value="0x7ffccff275c0" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;fontFamily=consolas;" parent="Rr48j6R8bM0mg8fOzwoo-1" vertex="1">
38+
<mxGeometry x="1" y="71" width="158" height="20" as="geometry" />
39+
</mxCell>
40+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-11" value="0x7ffccff275c1" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;fontFamily=consolas;" parent="Rr48j6R8bM0mg8fOzwoo-1" vertex="1">
41+
<mxGeometry x="1" y="51" width="158" height="20" as="geometry" />
42+
</mxCell>
43+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-12" value="... ..." style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;fontFamily=consolas;" parent="Rr48j6R8bM0mg8fOzwoo-1" vertex="1">
44+
<mxGeometry x="1" y="31" width="158" height="20" as="geometry" />
45+
</mxCell>
46+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-14" value="0x7ffccff275b6" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;fontFamily=consolas;" parent="Rr48j6R8bM0mg8fOzwoo-1" vertex="1">
47+
<mxGeometry x="1" y="271" width="158" height="20" as="geometry" />
48+
</mxCell>
49+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-15" value="... ..." style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=#10739e;fontFamily=consolas;" parent="Rr48j6R8bM0mg8fOzwoo-1" vertex="1">
50+
<mxGeometry x="1" y="291" width="158" height="20" as="geometry" />
51+
</mxCell>
52+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" parent="1" source="F_gYWv8rL4ZoQy9qiymJ-16" target="F_gYWv8rL4ZoQy9qiymJ-2" edge="1">
53+
<mxGeometry relative="1" as="geometry" />
54+
</mxCell>
55+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-16" value="d的第一个字节" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
56+
<mxGeometry x="188" y="386" width="95" height="30" as="geometry" />
57+
</mxCell>
58+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-19" value="" style="shape=curlyBracket;whiteSpace=wrap;html=1;rounded=1;labelPosition=left;verticalLabelPosition=middle;align=right;verticalAlign=middle;size=0.5;" parent="1" vertex="1">
59+
<mxGeometry x="280" y="251" width="40" height="159" as="geometry" />
60+
</mxCell>
61+
<mxCell id="F_gYWv8rL4ZoQy9qiymJ-20" value="因为double型占据8字节空间&lt;br&gt;我们就知道这些都是d对应的空间" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
62+
<mxGeometry x="190" y="285" width="95" height="90" as="geometry" />
63+
</mxCell>
64+
</root>
65+
</mxGraphModel>
66+
</diagram>
67+
</mxfile>
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<mxfile host="Electron" modified="2023-12-30T13:53:56.168Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/22.1.16 Chrome/120.0.6099.109 Electron/28.1.0 Safari/537.36" etag="ghih8-_Y0g8ZnqUgefIt" version="22.1.16" type="device">
2+
<diagram name="Page-1" id="xCV3qbr-aHJIMHQM99jd">
3+
<mxGraphModel dx="489" dy="336" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
4+
<root>
5+
<mxCell id="0" />
6+
<mxCell id="1" parent="0" />
7+
<mxCell id="pfWEPuTHE0WtEu-Z-9tJ-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;curved=1;" edge="1" parent="1" source="XeMqBI3337VZsXZ9aHH5-29" target="pfWEPuTHE0WtEu-Z-9tJ-1">
8+
<mxGeometry relative="1" as="geometry" />
9+
</mxCell>
10+
<mxCell id="pfWEPuTHE0WtEu-Z-9tJ-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;curved=1;" edge="1" parent="1" source="XeMqBI3337VZsXZ9aHH5-29" target="pfWEPuTHE0WtEu-Z-9tJ-2">
11+
<mxGeometry relative="1" as="geometry" />
12+
</mxCell>
13+
<mxCell id="XeMqBI3337VZsXZ9aHH5-29" value="&lt;p style=&quot;line-height: 100%;&quot;&gt;&lt;font face=&quot;Consolas&quot;&gt;double *pd {&amp;amp;d1};&lt;/font&gt;&lt;/p&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=#FAD9D5;align=center;" parent="1" vertex="1">
14+
<mxGeometry x="280" y="180" width="120" height="20" as="geometry" />
15+
</mxCell>
16+
<mxCell id="pfWEPuTHE0WtEu-Z-9tJ-1" value="&lt;p style=&quot;line-height: 100%;&quot;&gt;&lt;font face=&quot;Consolas&quot;&gt;pd = &amp;amp;d2;&lt;/font&gt;&lt;/p&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=#fad7ac;align=center;" vertex="1" parent="1">
17+
<mxGeometry x="200" y="260" width="120" height="20" as="geometry" />
18+
</mxCell>
19+
<mxCell id="pfWEPuTHE0WtEu-Z-9tJ-2" value="&lt;p style=&quot;line-height: 100%;&quot;&gt;&lt;font face=&quot;Consolas&quot;&gt;*pd = 1e10;&lt;/font&gt;&lt;/p&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeColor=none;fillColor=#dae8fc;align=center;" vertex="1" parent="1">
20+
<mxGeometry x="360" y="260" width="120" height="20" as="geometry" />
21+
</mxCell>
22+
<mxCell id="pfWEPuTHE0WtEu-Z-9tJ-6" value="&lt;font face=&quot;consolas&quot;&gt;改变指针的指向&lt;br&gt;d1和d2的值都不变&lt;br&gt;&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
23+
<mxGeometry x="200" y="280" width="120" height="40" as="geometry" />
24+
</mxCell>
25+
<mxCell id="pfWEPuTHE0WtEu-Z-9tJ-8" value="&lt;font face=&quot;consolas&quot;&gt;改变指针的内容&lt;br&gt;pd的指向不变&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
26+
<mxGeometry x="360" y="280" width="120" height="40" as="geometry" />
27+
</mxCell>
28+
</root>
29+
</mxGraphModel>
30+
</diagram>
31+
</mxfile>

0 commit comments

Comments
 (0)