多级指针运算

今天看到一道题目,研究了好一会儿终于高明白了,在这里拿出来和大家分享一下:

<code class="hljs perl has-numbering">大家可以先行计算一下。
<span class="hljs-comment">#include <stdio.h></span>

char <span class="hljs-variable">*c</span>[] = { <span class="hljs-string">"ENTER"</span>, <span class="hljs-string">"NEW"</span>, <span class="hljs-string">"POINT"</span>, <span class="hljs-string">"FIRST"</span> };
char <span class="hljs-variable">**</span>cp[] = { c + <span class="hljs-number">3</span>, c + <span class="hljs-number">2</span>, c + <span class="hljs-number">1</span>, c };
char <span class="hljs-variable">**</span><span class="hljs-variable">*cpp</span> = cp;

<span class="hljs-keyword">int</span> main(void)
{
    <span class="hljs-keyword">printf</span>(<span class="hljs-string">"<span class="hljs-variable">%s</span> "</span>, <span class="hljs-variable">**</span>++cpp);
    <span class="hljs-keyword">printf</span>(<span class="hljs-string">"<span class="hljs-variable">%s</span> "</span>, <span class="hljs-variable">*-</span>-<span class="hljs-variable">*+</span>+cpp + <span class="hljs-number">3</span>);
    <span class="hljs-keyword">printf</span>(<span class="hljs-string">"<span class="hljs-variable">%s</span> "</span>, <span class="hljs-variable">*cpp</span>[-<span class="hljs-number">2</span>] + <span class="hljs-number">3</span>);
    <span class="hljs-keyword">printf</span>(<span class="hljs-string">"<span class="hljs-variable">%s</span>\n"</span>, cpp[-<span class="hljs-number">1</span>][-<span class="hljs-number">1</span>] + <span class="hljs-number">1</span>);
    <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div>

那么究竟输出的结果是什么呢?
POINT ER ST EW
不知道小伙伴们有么有做对
接下来就是对答案的分析:

<code class="hljs perl has-numbering">(<span class="hljs-number">1</span>) <span class="hljs-keyword">printf</span>(<span class="hljs-string">"<span class="hljs-variable">%s</span> "</span>, <span class="hljs-variable">**</span>++cpp);<span class="hljs-regexp">//</span><span class="hljs-string">"POINT"</span>

    cpp=cp  cpp的值就是数组cp的首地址,即存储c+<span class="hljs-number">3</span>这块空间的地址。
    ++cpp   即cpp自加一,cpp的值为存储c+<span class="hljs-number">2</span>这块空间的地址
    <span class="hljs-variable">**</span>++cpp   即<span class="hljs-variable">*(</span>c+<span class="hljs-number">2</span>),即POINT的首地址


(<span class="hljs-number">2</span>) <span class="hljs-keyword">printf</span>(<span class="hljs-string">"<span class="hljs-variable">%s</span> "</span>, <span class="hljs-variable">*-</span>-<span class="hljs-variable">*+</span>+cpp + <span class="hljs-number">3</span>);<span class="hljs-regexp">//</span>ER

    ++cpp  cpp的值为存储c+<span class="hljs-number">1</span>这块空间的地址
    <span class="hljs-variable">*+</span>+cpp  拿到的就是数组cp的成员c+<span class="hljs-number">1</span>
    --<span class="hljs-variable">*+</span>+cpp  即--(c+<span class="hljs-number">1</span>),数组cp的第三个成员变为c
    <span class="hljs-variable">*-</span>-<span class="hljs-variable">*+</span>+cpp+<span class="hljs-number">3</span>  即<span class="hljs-variable">*c</span>+<span class="hljs-number">3</span>,就是ER的首地址


(<span class="hljs-number">3</span>) <span class="hljs-keyword">printf</span>(<span class="hljs-string">"<span class="hljs-variable">%s</span> "</span>, <span class="hljs-variable">*cpp</span>[-<span class="hljs-number">2</span>] + <span class="hljs-number">3</span>);<span class="hljs-regexp">//</span>ST

    cpp[-<span class="hljs-number">2</span>]   即<span class="hljs-variable">*(</span>cpp-<span class="hljs-number">2</span>),cpp的值为存储c+<span class="hljs-number">1</span>这块空间的地址(这块空间里的内容被改成了c),结果就是拿到c+<span class="hljs-number">3</span>
    <span class="hljs-variable">*cpp</span>[-<span class="hljs-number">2</span>] + <span class="hljs-number">3</span>   即ST的首地址




(<span class="hljs-number">4</span>)<span class="hljs-keyword">printf</span>(<span class="hljs-string">"<span class="hljs-variable">%s</span>\n"</span>, cpp[-<span class="hljs-number">1</span>][-<span class="hljs-number">1</span>] + <span class="hljs-number">1</span>);<span class="hljs-regexp">//</span>EW

    cpp[-<span class="hljs-number">1</span>]  即<span class="hljs-variable">*(</span>cpp-<span class="hljs-number">1</span>),cpp的值为存储c+<span class="hljs-number">1</span>这块空间的地址(这块空间里的内容被改成了c),结果就是拿到c+<span class="hljs-number">2</span>
    cpp[-<span class="hljs-number">1</span>][-<span class="hljs-number">1</span>]  即<span class="hljs-variable">*(</span>(c+<span class="hljs-number">2</span>)-<span class="hljs-number">1</span>),拿到NEW的首地址

</code>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值