506 lines
34 KiB
HTML
506 lines
34 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>成员访问运算符</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-c_language_operator_member_access skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">成员访问运算符</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="c.html">c</a>‎ | <a href="c-language.html">language</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>成员访问运算符允许访问其运算数的成员。</p>
|
|
<table class="wikitable" style="font-size:85%;">
|
|
<tr style="text-align:center">
|
|
<th>运算符</th>
|
|
<th>运算符名</th>
|
|
<th>示例</th>
|
|
<th>描述</th>
|
|
</tr>
|
|
<tr style="text-align:center">
|
|
<td><span class="t-c"><span class="mw-geshi c source-c"><span class="br0">[</span><span class="br0">]</span></span></span></td>
|
|
<td>数组下标</td>
|
|
<td><span class="t-c"><span class="mw-geshi c source-c">a<span class="br0">[</span>b<span class="br0">]</span></span></span></td>
|
|
<td>访问数组 <b>a</b> 的第 <b>b</b> 个元素</td>
|
|
</tr>
|
|
<tr style="text-align:center">
|
|
<td><span class="t-c"><span class="mw-geshi c source-c"><span class="sy2">*</span></span></span></td>
|
|
<td>指针解引用</td>
|
|
<td><span class="t-c"><span class="mw-geshi c source-c"><span class="sy2">*</span>a</span></span></td>
|
|
<td>解引用指针 <b>a</b> 以访问其所指向的对象或函数</td>
|
|
</tr>
|
|
<tr style="text-align:center">
|
|
<td><span class="t-c"><span class="mw-geshi c source-c"><span class="sy3">&</span></span></span></td>
|
|
<td>取址</td>
|
|
<td><span class="t-c"><span class="mw-geshi c source-c"><span class="sy3">&</span>a</span></span></td>
|
|
<td>创建指向对象或函数 <b>a</b> 的指针</td>
|
|
</tr>
|
|
<tr style="text-align:center">
|
|
<td><span class="t-c"><span class="mw-geshi c source-c">.</span></span></td>
|
|
<td>成员访问</td>
|
|
<td><span class="t-c"><span class="mw-geshi c source-c">a.<span class="me1">b</span></span></span></td>
|
|
<td>访问<a href="c-language-struct.html">结构体</a>或<a href="c-language-union.html">联合体</a> <b>a</b> 的成员 <b>b</b></td>
|
|
</tr>
|
|
<tr style="text-align:center">
|
|
<td><span class="t-c"><span class="mw-geshi c source-c"><span class="sy2">-</span><span class="sy1">></span></span></span></td>
|
|
<td>通过指针的成员访问</td>
|
|
<td><span class="t-c"><span class="mw-geshi c source-c">a<span class="sy2">-</span><span class="sy1">></span>b</span></span></td>
|
|
<td>访问 <b>a</b> 所指向的<a href="c-language-struct.html">结构体</a>或<a href="c-language-union.html">联合体</a> 的成员 <b>b</b></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E4.B8.8B.E6.A0.87">下标</span></h3>
|
|
<p>数组下标运算符拥有形式</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">pointer-expression</span> <code><b>[</b></code> <span class="t-spar">integer-expression</span> <code><b>]</b></code></td>
|
|
<td>(1)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">integer-expression</span> <code><b>[</b></code> <span class="t-spar">pointer-expression</span> <code><b>]</b></code></td>
|
|
<td>(2)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>其中</p>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">pointer-expression</span></td>
|
|
<td>-</td>
|
|
<td>指向完整对象指针类型的<a href="c-language-expressions.html">表达式</a></td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">integer-expression</span></td>
|
|
<td>-</td>
|
|
<td>整数类型<a href="c-language-expressions.html">表达式</a></td>
|
|
</tr>
|
|
</table>
|
|
<p>下标运算符为<a href="c-language-value_category.html">左值表达式</a>,其类型为 <span class="t-spar">pointer-expression</span> 所指向的对象的类型。</p>
|
|
<p>按照定义,下标运算符 <span class="t-c"><span class="mw-geshi c source-c">E1<span class="br0">[</span>E2<span class="br0">]</span></span></span> 准确等同于 <span class="t-c"><span class="mw-geshi c source-c"><span class="sy2">*</span><span class="br0">(</span><span class="br0">(</span>E1<span class="br0">)</span><span class="sy2">+</span><span class="br0">(</span>E2<span class="br0">)</span><span class="br0">)</span></span></span> 。若 <span class="t-spar">pointer-expression</span> 为数组表达式,则它经历<a href="c-language-conversion.html">左值到右值转换</a>并成为指向数组首元素的指针。</p>
|
|
<p>由于<a href="c-language-operator_arithmetic.html">指针与整数间加法</a>的定义,结果是下标等于 <span class="t-spar">integer-expression</span> 结果的数组元素(或若 <span class="t-spar">pointer-expression</span>指向某数组的第 i 个元素,则结果的下标为 i 加上 <span class="t-spar">integer-expression</span> 的结果)。</p>
|
|
<p>注意:多维数组上的细节见<a href="c-language-array.html">数组</a>。</p>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="co2">#include <stdio.h></span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw4">int</span> a<span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span> <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">1</span>,<span class="nu0">2</span>,<span class="nu0">3</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"%d %d<span class="es1">\n</span>"</span>, a<span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span>, <span class="co1">// n == 3</span>
|
|
<span class="nu0">2</span><span class="br0">[</span>a<span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 同上, n == 3</span>
|
|
a<span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span> <span class="sy1">=</span> <span class="nu0">7</span><span class="sy4">;</span> <span class="co1">// 下标表达式是左值</span>
|
|
|
|
<span class="kw4">int</span> n<span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span><span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span> <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">1</span>,<span class="nu0">2</span>,<span class="nu0">3</span>,<span class="nu0">4</span>,<span class="nu0">5</span>,<span class="nu0">6</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> <span class="br0">(</span><span class="sy2">*</span>p<span class="br0">)</span><span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span> <span class="sy1">=</span> <span class="sy3">&</span>n<span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span><span class="sy4">;</span> <span class="co1">// n 的元素为数组</span>
|
|
<span class="kw4">int</span> x <span class="sy1">=</span> n<span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span><span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span><span class="sy4">;</span> <span class="co1">// 再次应用 [] 到数组 n[1]</span>
|
|
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"%c %c<span class="es1">\n</span>"</span>, <span class="st0">"abc"</span><span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span>, <span class="nu0">2</span><span class="br0">[</span><span class="st0">"abc"</span><span class="br0">]</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 字符串字面量亦是数组</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">3 3
|
|
c c</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E8.A7.A3.E5.BC.95.E7.94.A8">解引用</span></h3>
|
|
<p><i>解引用</i>或<i>间接</i>表达式拥有形式</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><code><b>*</b></code> <span class="t-spar">pointer-expression</span></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>其中</p>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">pointer-expression</span></td>
|
|
<td>-</td>
|
|
<td>an <a href="c-language-expressions.html">expression</a> of any pointer type</td>
|
|
</tr>
|
|
</table>
|
|
<p>若 <span class="t-spar">pointer-expression</span> 为指向函数指针,则解引用运算符的结果为该函数的函数指代器。</p>
|
|
<p>若 <span class="t-spar">pointer-expression</span> 为指向对象指针,则结果为指代被指向对象的<a href="c-language-value_category.html">左值表达式</a>。</p>
|
|
<p>解引用空指针、指向在生存期外的对象的指针(悬垂指针)、错误对齐的指针或拥有不确定值的指针是未定义行为,除非如在 <span class="t-c"><span class="mw-geshi c source-c"><span class="sy3">&</span><span class="sy2">*</span>E</span></span> 中一般,通过应用取址运算符到解引用运算符的结果,将它置空。</p>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="co2">#include <stdio.h></span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span><span class="sy2">*</span> p <span class="sy1">=</span> <span class="sy3">&</span>n<span class="sy4">;</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"*p = %d<span class="es1">\n</span>"</span>, <span class="sy2">*</span>p<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// *p 的值即为存储于 n 的值</span>
|
|
<span class="sy2">*</span>p <span class="sy1">=</span> <span class="nu0">7</span><span class="sy4">;</span> <span class="co1">// *p 是左值</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"*p = %d<span class="es1">\n</span>"</span>, <span class="sy2">*</span>p<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">*p = 1
|
|
*p = 7</pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.96.E5.9D.80">取址</span></h3>
|
|
<p>取址运算符拥有形式</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>&</b></code> <span class="t-spar">function</span></td>
|
|
<td>(1)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>&</b></code> <span class="t-spar">lvalue-expression</span></td>
|
|
<td>(2)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>&</b></code> <code><b>*</b></code> <span class="t-spar">expression</span></td>
|
|
<td>(3)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>&</b></code> <span class="t-spar">expression</span> <code><b>[</b></code> <span class="t-spar">expression</span> <code><b>]</b></code></td>
|
|
<td>(4)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 函数地址</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 对象地址</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 特殊情况: & 与 * 彼此抵消,均不求值</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> 特殊情况: & 与 [] 中隐含的 * 抵消,只求值 [] 中隐含的加法
|
|
<p>其中</p>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">lvalue-expression</span></td>
|
|
<td>-</td>
|
|
<td>拥有任何非<a href="c-language-bit_field.html">位域</a>类型且无 <a href="c-language-storage_duration.html">register</a> 存储类的<a href="c-language-value_category.html">左值</a>表达式</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<p>取址运算符产生其运算数的<a href="c-language-value_category.html">非左值</a>地址,适于初始化指向运算数类型的指针。若运算数为函数指代器 (<span class="t-v">(1)</span>) ,则结果为指向函数指针。若运算数为对象 (<span class="t-v">(2)</span>) ,则结果为指向对象指针。</p>
|
|
<p>若运算数为解引用运算符,则不进行动作(故可以应用 &* 到空指针),除了结果是非左值。</p>
|
|
<p>若运算数是数组下标表达式,则不进行数组到指针转换和加法外的动作,故 &a[N] 对大小为 N 的数组合法(可以获得尾后一位置指针,不能解引用它,但此表达式中解引用被取消)。</p>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="kw4">int</span> f<span class="br0">(</span><span class="kw4">char</span> c<span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> c<span class="sy4">;</span><span class="br0">}</span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> <span class="sy2">*</span>p <span class="sy1">=</span> <span class="sy3">&</span>n<span class="sy4">;</span> <span class="co1">// 对象 n 的地址</span>
|
|
<span class="kw4">int</span> <span class="br0">(</span><span class="sy2">*</span>fp<span class="br0">)</span><span class="br0">(</span><span class="kw4">char</span><span class="br0">)</span> <span class="sy1">=</span> <span class="sy3">&</span>f<span class="sy4">;</span> <span class="co1">// 函数 f 的地址</span>
|
|
<span class="kw4">int</span> a<span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span> <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">1</span>,<span class="nu0">2</span>,<span class="nu0">3</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> <span class="sy2">*</span>beg<span class="sy1">=</span>a, <span class="sy2">*</span>end<span class="sy1">=</span><span class="sy3">&</span>a<span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span><span class="sy4">;</span> <span class="co1">// 同 end = n+3</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E6.88.90.E5.91.98.E8.AE.BF.E9.97.AE">成员访问</span></h3>
|
|
<p>成员访问运算符拥有形式</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><span class="t-spar">expression</span> <code><b>.</b></code> <span class="t-spar">member-name</span></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>其中</p>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">expression</span></td>
|
|
<td>-</td>
|
|
<td><a href="c-language-struct.html">结构体</a>或<a href="c-language-union.html">联合体</a>类型表达式</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">member-name</span></td>
|
|
<td>-</td>
|
|
<td>指名 <span class="t-spar">expression</span> 所指带的结构体或联合体的成员的<a href="c-language-identifier.html">标识符</a></td>
|
|
</tr>
|
|
</table>
|
|
<p>成员访问表达式指代其左运算数所指代的 <a href="c-language-struct.html">struct</a> 或 <a href="c-language-union.html">union</a> 的具名成员。它拥有与其左运算数相同的<a href="c-language-value_category.html">值类别</a>。</p>
|
|
<p>若左运算为 <a href="c-language-const.html">const</a> 或 <a href="c-language-volatile.html">volatile</a> 限定,则结果亦有限定。若左运算数为<a href="c-language-atomic.html">原子对象</a>,则行为未定义。</p>
|
|
<p>注意:除了指名结构体或联合体的标识符,下列表达式亦可拥有结构体或联合体类型:<a href="c-language-operator_assignment.html">赋值</a>、<a href="c-language-operator_other.html#.E5.87.BD.E6.95.B0.E8.B0.83.E7.94.A8">函数调用</a>、<a href="c-language-operator_other.html#.E9.80.97.E5.8F.B7.E8.BF.90.E7.AE.97.E7.AC.A6">逗号运算符</a>、<a href="c-language-operator_other.html#.E6.9D.A1.E4.BB.B6.E8.BF.90.E7.AE.97.E7.AC.A6">条件运算符</a>和<a href="c-language-compound_literal.html">复合字面量</a>。</p>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="co2">#include <stdio.h></span>
|
|
<span class="kw1">struct</span> s <span class="br0">{</span><span class="kw4">int</span> x<span class="sy4">;</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">struct</span> s f<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> <span class="br0">(</span><span class="kw1">struct</span> s<span class="br0">)</span><span class="br0">{</span><span class="nu0">1</span><span class="br0">}</span><span class="sy4">;</span> <span class="br0">}</span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw1">struct</span> s s<span class="sy4">;</span>
|
|
s.<span class="me1">x</span> <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span> <span class="co1">// OK :更改 s 的成员</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> f<span class="br0">(</span><span class="br0">)</span>.<span class="me1">x</span><span class="sy4">;</span> <span class="co1">// f() 为 struct s 类型表达式</span>
|
|
<span class="co1">// f().x = 1; // 错误:此成员访问表达式非左值</span>
|
|
|
|
<span class="kw4">const</span> <span class="kw1">struct</span> s sc<span class="sy4">;</span>
|
|
<span class="co1">// sc.x = 3; // 错误: sc.x 为 const ,不能被赋值</span>
|
|
|
|
<span class="kw1">union</span> <span class="br0">{</span> <span class="kw4">int</span> x<span class="sy4">;</span> <span class="kw4">double</span> d<span class="sy4">;</span> <span class="br0">}</span> u <span class="sy1">=</span> <span class="br0">{</span><span class="nu0">1</span><span class="br0">}</span><span class="sy4">;</span>
|
|
u.<span class="me1">d</span> <span class="sy1">=</span> <span class="nu16">0.1</span><span class="sy4">;</span> <span class="co1">// 更改 union 的活跃成员</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E9.80.9A.E8.BF.87.E6.8C.87.E9.92.88.E7.9A.84.E6.88.90.E5.91.98.E8.AE.BF.E9.97.AE">通过指针的成员访问</span></h3>
|
|
<p>成员访问表达式拥有形式</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><span class="t-spar">expression</span> <code><b>-></b></code> <span class="t-spar">member-name</span></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<p>其中</p>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">expression</span></td>
|
|
<td>-</td>
|
|
<td>指向<a href="c-language-struct.html">结构体</a>或<a href="c-language-union.html">联合体</a>的<a href="c-language-pointer.html">指针</a>类型表达式</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">member-name</span></td>
|
|
<td>-</td>
|
|
<td>指名 <span class="t-spar">expression</span> 所指向的结构体或联合体的成员的<a href="c-language-identifier.html">标识符</a></td>
|
|
</tr>
|
|
</table>
|
|
<p>通过指针的成员访问表达式指代其左运算数所指向的 <a href="c-language-struct.html">struct</a> 或 <a href="c-language-union.html">union</a> 类型的具名成员。其值类别始终为<a href="c-language-value_category.html">左值</a>。</p>
|
|
<p>若左运算数所指向的类型有 <a href="c-language-const.html">const</a> 或 <a href="c-language-volatile.html">volatile</a> 限定,则结果亦有限定。若左运算数所指向的类型为<a href="c-language-atomic.html">原子类型</a>,则行为未定义。</p>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="c source-c">
|
|
<pre class="de1"><span class="co2">#include <stdio.h></span>
|
|
<span class="kw1">struct</span> s <span class="br0">{</span><span class="kw4">int</span> x<span class="sy4">;</span><span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="kw4">void</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw1">struct</span> s s<span class="sy1">=</span><span class="br0">{</span><span class="nu0">1</span><span class="br0">}</span>, <span class="sy2">*</span>p <span class="sy1">=</span> <span class="sy3">&</span>s<span class="sy4">;</span>
|
|
p<span class="sy2">-</span><span class="sy1">></span>x <span class="sy1">=</span> <span class="nu0">7</span><span class="sy4">;</span> <span class="co1">// 通过指针更改 s.x 的值</span>
|
|
<a href="c-io-fprintf.html"><span class="kw851">printf</span></a><span class="br0">(</span><span class="st0">"%d<span class="es1">\n</span>"</span>, p<span class="sy2">-</span><span class="sy1">></span>x<span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 打印 7</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.BC.95.E7.94.A8">引用</span></h3>
|
|
<div class="t-ref-std-11">
|
|
<ul>
|
|
<li>C11 标准(ISO/IEC 9899:2011):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5.2.1 Array subscripting (p: 80)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5.2.3 Structure and union members (p: 82-84)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5.3.2 Address and indirection operators (p: 88-89)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c99">
|
|
<ul>
|
|
<li>C99 标准(ISO/IEC 9899:1999):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5.2.1 Array subscripting (p: 70)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5.2.3 Structure and union members (p: 72-74)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>6.5.3.2 Address and indirection operators (p: 78-79)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<div class="t-ref-std-c89">
|
|
<ul>
|
|
<li>C89/C90 标准(ISO/IEC 9899:1990):</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.3.2.1 Array subscripting</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.3.2.3 Structure and union members</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>3.3.3.2 Address and indirection operators</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<ul>
|
|
<li><a href="c-language-operator_precedence.html">运算符优先级</a></li>
|
|
</ul>
|
|
<table class="wikitable">
|
|
<tr style="text-align:center">
|
|
<th colspan="7">常用运算符</th>
|
|
</tr>
|
|
<tr style="text-align:center">
|
|
<td><a href="c-language-operator_assignment.html">赋值</a></td>
|
|
<td><a href="c-language-operator_incdec.html">自增<br />
|
|
自减</a></td>
|
|
<td><a href="c-language-operator_arithmetic.html">算术</a></td>
|
|
<td><a href="c-language-operator_logical.html">逻辑</a></td>
|
|
<td><a href="c-language-operator_comparison.html">比较</a></td>
|
|
<td><strong class="selflink">成员<br />
|
|
访问</strong></td>
|
|
<td><a href="c-language-operator_other.html">其他</a></td>
|
|
</tr>
|
|
<tr style="text-align:center">
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi c source-c">a <span class="sy1">=</span> b<br />
|
|
a <span class="sy2">+</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy2">-</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy2">*</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy2">/</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy2">%</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy3">&</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy3">|</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy3">^</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy1"><<=</span> b<br />
|
|
a <span class="sy1">>>=</span> b</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi c source-c"><span class="sy2">++</span>a<br />
|
|
<span class="sy2">--</span>a<br />
|
|
a<span class="sy2">++</span><br />
|
|
a<span class="sy2">--</span></span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi c source-c"><span class="sy2">+</span>a<br />
|
|
<span class="sy2">-</span>a<br />
|
|
a <span class="sy2">+</span> b<br />
|
|
a <span class="sy2">-</span> b<br />
|
|
a <span class="sy2">*</span> b<br />
|
|
a <span class="sy2">/</span> b<br />
|
|
a <span class="sy2">%</span> b<br />
|
|
~a<br />
|
|
a <span class="sy3">&</span> b<br />
|
|
a <span class="sy3">|</span> b<br />
|
|
a <span class="sy3">^</span> b<br />
|
|
a <span class="sy1"><<</span> b<br />
|
|
a <span class="sy1">>></span> b</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi c source-c"><span class="sy3">!</span>a<br />
|
|
a <span class="sy3">&&</span> b<br />
|
|
a <span class="sy3">||</span> b</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi c source-c">a <span class="sy1">==</span> b<br />
|
|
a <span class="sy3">!</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy1"><</span> b<br />
|
|
a <span class="sy1">></span> b<br />
|
|
a <span class="sy1"><=</span> b<br />
|
|
a <span class="sy1">>=</span> b</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi c source-c">a<span class="br0">[</span>b<span class="br0">]</span><br />
|
|
<span class="sy2">*</span>a<br />
|
|
<span class="sy3">&</span>a<br />
|
|
a<span class="sy2">-</span><span class="sy1">></span>b<br />
|
|
a.<span class="me1">b</span></span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi c source-c">a<span class="br0">(</span>...<span class="br0">)</span><br />
|
|
a, b<br />
|
|
<span class="br0">(</span>type<span class="br0">)</span> a<br />
|
|
<span class="sy4">?</span> <span class="sy4">:</span><br />
|
|
<span class="kw4">sizeof</span><br />
|
|
_Alignof</span></span> <span class="t-mark-rev t-since-c11">(C11 起)</span></p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|