gobyexample/public/pointers
2019-10-14 23:20:44 +03:00

200 lines
8.1 KiB
Plaintext
Generated
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Go в примерах: Указатели (Pointers)</title>
<link rel=stylesheet href="site.css">
</head>
<script>
onkeydown = (e) => {
if (e.key == "ArrowLeft") {
window.location.href = 'recursion';
}
if (e.key == "ArrowRight") {
window.location.href = 'structs';
}
}
</script>
<body>
<div class="example" id="pointers">
<h2><a href="./">Go в примерах</a>: Указатели (Pointers)</h2>
<table>
<tr>
<td class="docs">
<p>Go поддерживает <em><a href="http://en.wikipedia.org/wiki/Pointer_(computer_programming)">указатели</a></em>,
позволяя вам передавать ссылки на значения и записи
в вашей программе.</p>
</td>
<td class="code empty leading">
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<a href="http://play.golang.org/p/VHnMkOQfQea" target="_blank"><img title="Run code" src="play.png" class="run" /></a><img title="Copy code" src="clipboard.png" class="copy" />
<div class="highlight"><pre><span class="kn">package</span> <span class="nx">main</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<div class="highlight"><pre><span class="kn">import</span> <span class="s">&quot;fmt&quot;</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Мы покажем, как работают указатели, на примере 2 функций:
<code>zeroval</code> и <code>zeroptr</code>. В <code>zeroval</code> определен только 1
аргумент с типом <code>int</code>, который передается по значению.
<code>zeroval</code> получает копию <code>ival</code> при вызове функции.</p>
</td>
<td class="code leading">
<div class="highlight"><pre><span class="kd">func</span> <span class="nx">zeroval</span><span class="p">(</span><span class="nx">ival</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">ival</span> <span class="p">=</span> <span class="mi">0</span>
<span class="p">}</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p><code>zeroptr</code> получает в качестве аргумента параметр <code>*int</code>,
который является указателем на <code>int</code>. Запись <code>*iptr</code> в
теле функции <em>разыменовывает</em> указатель с его адреса
памяти на текущее значение по этому адресу. Присвоение
значения разыменованному указателю изменяет значение
по указанному адресу.</p>
</td>
<td class="code leading">
<div class="highlight"><pre><span class="kd">func</span> <span class="nx">zeroptr</span><span class="p">(</span><span class="nx">iptr</span> <span class="o">*</span><span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
<span class="o">*</span><span class="nx">iptr</span> <span class="p">=</span> <span class="mi">0</span>
<span class="p">}</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<div class="highlight"><pre><span class="kd">func</span> <span class="nx">main</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">i</span> <span class="o">:=</span> <span class="mi">1</span>
<span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;initial:&quot;</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<div class="highlight"><pre> <span class="nx">zeroval</span><span class="p">(</span><span class="nx">i</span><span class="p">)</span>
<span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;zeroval:&quot;</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Запись <code>&amp;i</code> получается ссылку на область памяти, в
которой хранится <code>i</code>, т.е. указатель на <code>i</code>.</p>
</td>
<td class="code leading">
<div class="highlight"><pre> <span class="nx">zeroptr</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">i</span><span class="p">)</span>
<span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;zeroptr:&quot;</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span>
</pre></div>
</td>
</tr>
<tr>
<td class="docs">
<p>Указатели могут быть выведены на экран</p>
</td>
<td class="code">
<div class="highlight"><pre> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">&quot;pointer:&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="nx">i</span><span class="p">)</span>
<span class="p">}</span>
</pre></div>
</td>
</tr>
</table>
<table>
<tr>
<td class="docs">
<p><code>zeroval</code> не изменяет значение <code>i</code> в <code>main</code>, но
<code>zeroptr</code> изменяет, т.к. в него передается указатель
на область памяти, в которой хранится переменная.</p>
</td>
<td class="code">
<div class="highlight"><pre><span class="gp">$</span> go run pointers.go
<span class="go">initial: 1</span>
<span class="go">zeroval: 1</span>
<span class="go">zeroptr: 0</span>
<span class="go">pointer: 0x42131100</span>
</pre></div>
</td>
</tr>
</table>
<p class="next">
Следующий пример: <a href="structs">Структуры (Structs)</a>.
</p>
<p class="footer">
by <a href="https://markmcgranaghan.com">Mark McGranaghan</a> | <a href="https://github.com/mmcgrana/gobyexample/blob/master/examples/pointers">source</a> | <a href="https://github.com/mmcgrana/gobyexample#license">license</a>
</p>
</div>
<script>
var codeLines = [];
codeLines.push('');codeLines.push('package main\u000A');codeLines.push('import \"fmt\"\u000A');codeLines.push('func zeroval(ival int) {\u000A ival = 0\u000A}\u000A');codeLines.push('func zeroptr(iptr *int) {\u000A *iptr = 0\u000A}\u000A');codeLines.push('func main() {\u000A i := 1\u000A fmt.Println(\"initial:\", i)\u000A');codeLines.push(' zeroval(i)\u000A fmt.Println(\"zeroval:\", i)\u000A');codeLines.push(' zeroptr(&i)\u000A fmt.Println(\"zeroptr:\", i)\u000A');codeLines.push(' fmt.Println(\"pointer:\", &i)\u000A}\u000A');codeLines.push('');
</script>
<script src="site.js" async></script>
</body>
</html>