c/notes/01_c-basic/06_xdx/index.html

74 lines
83 KiB
HTML
Raw Normal View History

<!DOCTYPE html>
<html lang="zh-CN" dir="ltr">
<head>
<meta charset="utf-8">
<title>第一章:颇具争议的指针 | Hi终于等到你</title>
<meta name="description" content="许大仙前端、Java、大数据、云原生">
<meta name="generator" content="VitePress v1.3.1">
<link rel="preload stylesheet" href="/c/assets/style.DF3ihcHP.css" as="style">
<script type="module" src="/c/assets/app.BPRxCQ6e.js"></script>
<link rel="preload" href="/c/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="modulepreload" href="/c/assets/chunks/framework.CZKtKhAm.js">
<link rel="modulepreload" href="/c/assets/chunks/theme.DCVMOSJA.js">
<link rel="modulepreload" href="/c/assets/notes_01_c-basic_06_xdx_index.md.Z0IDTw1X.lean.js">
<link rel="shortcut icon" href="/c//logo.svg">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no,shrink-to-fit=no">
<meta name="keywords" content="许大仙,许大仙的博客">
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
</head>
<body>
<div id="app"><div class="Layout" data-v-5d98c3a5><!--[--><!--]--><!--[--><span tabindex="-1" data-v-0f60ec36></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-0f60ec36> Skip to content </a><!--]--><!----><header class="VPNav" data-v-5d98c3a5 data-v-ae24b3ad><div class="VPNavBar has-sidebar top" data-v-ae24b3ad data-v-6aa21345><div class="wrapper" data-v-6aa21345><div class="container" data-v-6aa21345><div class="title" data-v-6aa21345><div class="VPNavBarTitle has-sidebar" data-v-6aa21345 data-v-ab179fa1><a class="title" href="/c/" data-v-ab179fa1><!--[--><!--]--><!--[--><img class="VPImage logo" src="/c/logo.svg" alt data-v-8426fc1a><!--]--><span data-v-ab179fa1>许大仙</span><!--[--><!--]--></a></div></div><div class="content" data-v-6aa21345><div class="content-body" data-v-6aa21345><!--[--><!--]--><div class="VPNavBarSearch search" data-v-6aa21345><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-6aa21345 data-v-dc692963><span id="main-nav-aria-label" class="visually-hidden" data-v-dc692963> Main Navigation </span><!--[--><!--[--><a class="VPLink link vp-external-link-icon VPNavBarMenuLink" href="https://aexiar.github.io/" target="_blank" rel="noreferrer" tabindex="0" data-v-dc692963 data-v-9c663999><!--[--><span data-v-9c663999>首页</span><!--]--></a><!--]--><!--[--><a class="VPLink link vp-external-link-icon VPNavBarMenuLink" href="https://aexiar.github.io/coa6/notes/" target="_blank" rel="noreferrer" tabindex="0" data-v-dc692963 data-v-9c663999><!--[--><span data-v-9c663999>计组6件套</span><!--]--></a><!--]--><!--[--><div class="VPFlyout VPNavBarMenuGroup" data-v-dc692963 data-v-b6c34ac9><button type="button" class="button" aria-haspopup="true" aria-expanded="false" data-v-b6c34ac9><span class="text" data-v-b6c34ac9><!----><span data-v-b6c34ac9>编程语言</span><span class="vpi-chevron-down text-icon" data-v-b6c34ac9></span></span></button><div class="menu" data-v-b6c34ac9><div class="VPMenu" data-v-b6c34ac9 data-v-b98bc113><div class="items" data-v-b98bc113><!--[--><!--[--><div class="VPMenuLink" data-v-b98bc113 data-v-43f1e123><a class="VPLink link" href="/c/notes/" data-v-43f1e123><!--[-->c/c++<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b98bc113 data-v-43f1e123><a class="VPLink link vp-external-link-icon" href="https://aexiar.github.io/web-design/notes/" target="_blank" rel="noreferrer" data-v-43f1e123><!--[-->前端<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b98bc113 data-v-43f1e123><a class="VPLink link vp-external-link-icon" href="https://aexiar.github.io/java/notes/" target="_blank" rel="noreferrer" data-v-43f1e123><!--[-->Java<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b98bc113 data-v-43f1e123><a class="VPLink link vp-external-link-icon" href="https://aexiar.github.io/big-data/notes/" target="_blank" rel="noreferrer" data-v-43f1e123><!--[-->大数据<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b98bc113 data-v-43f1e123><a class="VPLink link vp-external-link-icon" href="https://aexiar.github.io/linux/notes/" target="_blank" rel="noreferrer" data-v-43f1e123><!--[-->云原生<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b98bc113 data-v-43f1e123><a class="VPLink link vp-external-link-icon" href="https://aexiar.github.io/go/notes/" target="_blank" rel="noreferrer" data-v-43f1e123><!--[-->Go<!--]--></a></div><!--]--><!--[--><div class="VPMenuLink" data-v-b98bc113 data-v-43f1e123><a class="VPLink link vp-external-link-icon" href="https://aexiar.github.io/python/notes/" target="_blank" rel="noreferrer" data-v-43f1e123><!--[-->Python<!--]--
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 定义变量,即:开辟一块内存空间,并将初始化值存储进去</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> num </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 访问变量,即:访问变量在内存中对应的数据</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;num = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%d\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, num);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 给变量赋值,即:给变量在内存中占据的内存空间存储数据</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> num </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 100</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 访问变量,即:访问变量在内存中对应的数据</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;num = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%d\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, num);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br></div></div><ul><li>上述的这种方式也称为<code>直接访问</code>;当然,既然有<code>直接访问</code>的方式,必然有<code>间接访问</code>的方式,如:<code>指针</code></li></ul><div class="important custom-block github-alert"><p class="custom-block-title">IMPORTANT</p><p></p><ul><li>① 我们通过<code>变量名(普通变量)</code>访问内存中变量存储的数据,之所以称为<code>直接访问</code>的方式,是因为对于我们写程序而言,我们无需关心如何根据内存地址去获取变量对应的数据,以及如何根据内存地址将数据存储到对应的内存空间,这些操作步骤都是<code>编译器</code>帮助我们在底层完成的(自动化)。</li><li>② 但是,我们也可以通过<code>内存地址</code>去操作内存中对应的数据(手动化),这种方式就称为<code>间接访问</code>的方式了,相对于<code>直接访问</code>方式来说,要理解的概念和操作的步骤要比之间<code>直接访问</code>方式要多很多,但是效率高。</li></ul></div><h2 id="_3-2-内存地址和指针" tabindex="-1">3.2 内存地址和指针 <a class="header-anchor" href="#_3-2-内存地址和指针" aria-label="Permalink to &quot;3.2 内存地址和指针&quot;"></a></h2><ul><li>其实,在之前《数组》中,我们就已经讲解了<code>内存地址</code>的概念了,即:操作系统为了更快的去管理内存中的数据,会将<code>内存条</code>按照<code>字节</code>划分为一个个的<code>单元格</code>,并为每个独立的小的<code>单元格</code>,分配<code>唯一的编号</code>,即:<code>内存地址</code>,如下所示:</li></ul><p><img src="/c/assets/4.DqDR6Thp.svg" alt=""></p><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>有了内存地址,就能加快数据的存取速度,可以类比生活中的<code>字典</code>,即:</p><ul><li>① 内存地址是计算机中用于标识内存中某个特定位置的数值。</li><li>② 每个内存单元都有一个唯一的地址,这些地址可以用于访问和操作存储在内存中的数据。</li></ul></div><ul><li>对于之前的代码,如下所示:</li></ul><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &lt;stdio.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() {</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 定义变量,即:开辟一块内存空间,并将初始化值存储进去</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> num </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><ul><li>其在内存中,就是这样的,如下所示:</li></ul><p><img src="/c/assets/5.DrgPMfu7.png" alt=""></p><ul><li>虽然,之前我们在程序中都是通过<code>变量名(普通变量)</code>直接操作内存中的存储单元;但是,编译器底层还是会通过<code>内存地址</code>来找到所需要的存储单元,如下所示:</li></ul><p><img src="/c/assets/6.Bw9onr80.svg" alt=""></p><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>通过<code>内存地址</code>找到所需要的<code>存储单元</code>,即:内存地址指向该存储单元。此时,就可以将<code>内存地址</code>形象化的描述为<code>指针👉</code>,那么:</p><ul><li><code>变量</code>:命名的内存空间,用于存放各种类型的数据。</li><li><code>变量名</code>:变量名是给内存空间取一个容易记忆的名字,方便我们编写程序。</li><li><code>变量值</code>:变量所对应的内存中的存储单元中存放的数据值。</li><li><code>变量的地址</code>:变量所对应的内存中的存储单元的内存地址,也可以称为<code>指针</code></li></ul><p>总结:内存地址 = 指针。</p></div><ul><li><code>普通变量</code>所对应的内存空间<code>存储</code>的是<code>普通的值</code>,如:整数、小数、字符等;<code>指针变量</code>所对应的内存空间<code>存储</code>的是另外一个变量的<code>地址(指针)</code>,如下所示:</li></ul><p><img src="/c/assets/7.B6UNY_Yj.svg" alt=""></p><div class="note custom-block github-alert"><p class="custom-block-title">NOTE</p><p></p><p>有的时候,为了方便阐述,我们会将<code>指针变量</code>称为<code>指针</code>。但是,需要记住的是:</p><ul><li>指针 = 内存地址。</li><li>指针变量 = 变量中保存的是另一个变量的地址。</li></ul><p>下文中提及的<code>指针</code>都是<code>指针变量</code>,不再阐述!!!</p></div><h2 id="_3-2-普通变量和指针变量的区别" tabindex="-1">3.2 普通变量和指针变量的区别 <a class="header-anchor" href="#_3-2-普通变量和指针变量的区别" aria-label="Permalink to &quot;3.2 普通变量和指针变量的区别&quot;"></a></h2><p>在 CLion 中使用 GDB 调试时,可以通过反编译代码来查看指针变量和普通变量的区别。下面是具体的步骤:</p><h3 id="设置-gdb-调试器" tabindex="-1">设置 GDB 调试器 <a class="header-anchor" href="#设置-gdb-调试器" aria-label="Permalink to &quot;设置 GDB 调试器&quot;"></a></h3><ol><li>打开 CLion并加载你的项目。</li><li>确保你使用的是带有 GDB 支持的工具链(如 GCC 工具链)。</li><li>在 CLion 的设置中,确保调试器设置为 GDB。</li></ol><h3 id="编译你的代码" tabindex="-1">编译你的代码 <a class="header-anchor" href="#编译你的代码" aria-label="Permalink to &quot;编译你的代码&quot;"></a></h3><p>确保在编译你的代码时使用了调试信息生成选项(如 <code>-g</code>)。你可以在 CMakeLists.txt 文件中添加以下行:</p><div class="language-cmake vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">cmake</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">set</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> int</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">p </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> &amp;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">a;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> std</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">::cout </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&lt;&lt;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;a: &quot;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> &lt;&lt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&lt;&lt;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;, p: &quot;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> &lt;&lt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> p </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&lt;&lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> std</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">::endl;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><p>在 CLion 中设置断点并开始调试,程序将在 <code>std::cout</code> 行暂停。此时在调试控制台中输入以下命令:</p><ul><li><code>print a</code>:输出变量 <code>a</code> 的值,应该是 <code>10</code></li><li><code>print p</code>:输出指针变量 <code>p</code> 的值,即 <code>a</code> 的地址。</li><li><code>print *p</code>:输出指针 <code>p</code> 指向的值,即 <code>10</code></li></ul><p>通过这些命令,你可以看到指针变量 <code>p</code> 实际上存储的是一个地址,而普通变量 <code>a</code> 存储的是一个整数值。</p><h4 id="使用反汇编" tabindex="-1">使用反汇编 <a class="header-anchor" href="#使用反汇编" aria-label="Permalink to &quot;使用反汇编&quot;"></a></h4><p>在某些情况下,你可能需要查看反汇编代码来更深入地理解变量的存储方式。使用以下命令可以查看当前函数的反汇编代码:</p><ul><li><code>disassemble</code>:反汇编当前函数的代码。</li><li><code>x/4wx &amp;a</code>:查看变量 <code>a</code> 的内存内容。</li></ul><h3 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;"></a></h3><p>在 CLion 中使用 GDB 调试时,通过查看变量值和反汇编代码,可以清楚地区分指针变量和普通变量。指针变量存储地址,而普通变量存储实际的值,通过适当的 GDB 命令可以轻松辨别两者的区别。</p><h1 id="第四章-指针的运算-⭐" tabindex="-1">第四章:指针的运算(⭐) <a class="header-anchor" href="#第四章-指针的运算-⭐" aria-label="Permalink to &quot;第四章:指针的运算(⭐)&quot;"></a></h1><h2 id="_4-1-概述" tabindex="-1">4.1 概述 <a class="header-anchor" href="#_4-1-概述" aria-label="Permalink to &quot;4.1 概述&quot;"></a></h2><h2 id="_4-2-总结" tabindex="-1">4.2 总结 <a class="header-anchor" href="#_4-2-总结" aria-label="Permalink to &quot;4.2 总结&quot;"></a></h2><ul><li><p>在 C 语言中,<code>普通变量</code>是直接存储<code>数据</code><code>变量</code>。对于普通变量,支持的操作包括:</p><ul><li><strong>赋值操作</strong>:给变量赋值,如:<code>int a = 5</code></li><li><strong>算术运算</strong>:可以对数值类型的普通变量进行加、减、乘、除等运算,如:<code>a + b</code><code>a - b</code><code>a * b</code><code>a / b</code></li><li><strong>关系运算</strong>:可以进行比较运算(大于、小于、等于等),如: <code>a &gt; b</code><code>a == b</code></li><li><strong>逻辑运算</strong>:对布尔类型的值进行与、或、非运算,如: <code>a &amp;&amp; b</code><code>a || b</code><code>!a</code></li><li><strong>位运算</strong>:对整数类型的值进行位操作(与、或、异或、取反、左移、右移等),如: <code>a &amp; b</code><code>a | b</code><code>a ^ b</code><code>~a</code><code>a &lt;&lt; 2</code><code>a &gt;&gt; 2</code></li><li><strong>自增自减运算</strong><code>a++</code><code>--a</code> 等。</li></ul></li><li><p>在 C 语言中,<code>指针变量</code>存储的是<code>另一个变量</code><code>地址</code>。对于指针变量,支持的操作包括:</p><ul><li><strong>赋值操作</strong>:可以将一个地址赋值给指针,如: <code>int *p = &amp;a;</code></li><li><strong>解引用操作</strong>通过指针访问它指向的变量<EFBFBD>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">ptr </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> arr;</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 这句话是合法的ptr现在指向arr[0]</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%p\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, arr);</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 打印数组名,会打印数组首地址</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%p\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&amp;</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">arr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]);</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 打印第一个元素的地址</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div></li><li><p><strong>数组名是常量指针</strong> 数组名是一个常量指针,不能改变它指向的位置,而指针变量可以改变它指向的位置。</p><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> arr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">ptr </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> arr;</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 合法ptr指向arr[0]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">ptr</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 合法ptr现在指向arr[1]</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// arr++; // 非法,编译错误,因为数组名是常量,不能改变</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div></li><li><p><strong>sizeof运算符的结果不同</strong> 使用<code>sizeof</code>运算符对数组名和指针变量会得到不同的结果,数组名会返回整个数组的大小,而指针变量会返回指针本身的大小。</p><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> arr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">ptr </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> arr;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;sizeof(arr) = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%lu\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">sizeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(arr));</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 返回数组的大小5 * sizeof(int)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;sizeof(ptr) = </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%lu\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">sizeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(ptr));</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 返回指针的大小通常是4或8字节</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div></li><li><p><strong>地址运算符的结果不同</strong> 使用地址运算符<code>&amp;</code>对数组名和指针变量会得到不同的结果,对数组名使用<code>&amp;</code>会返回数组的地址,而对指针变量使用<code>&amp;</code>会返回指针变量本身的地址。</p><div class="language-c vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> arr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">ptr </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> arr;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Address of array: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%p\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&amp;</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">arr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 返回整个数组的地址</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;Address of pointer: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%p\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&amp;</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">ptr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // 返回指针变量ptr的地址</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div></li></ol><p>综上所述,通过这些示例和解释,可以看出数组名虽然在某些场合下可以像指针一样使用,但它并不是一个真正的指针变量,而是一个常量,表示数组的首地址。</p></div></div></main><footer class="VPDocFooter" data-v-39a288b8 data-v-e257564d><!--[--><!--]--><div class="edit-info" data-v-e257564d><!----><div class="last-updated" data-v-e257564d><p class="VPLastUpdated" data-v-e257564d data-v-e98dd255>上次更新: <time datetime="2024-08-08T02:25:06.000Z" data-v-e98dd255></time></p></div></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-e257564d><span class="visually-hidden" id="doc-footer-aria-label" data-v-e257564d>Pager</span><div class="pager" data-v-e257564d><a class="VPLink link pager-link prev" href="/c/notes/01_c-basic/05_xdx/" data-v-e257564d><!--[--><span class="desc" data-v-e257564d>上一篇</span><span class="title" data-v-e257564d>数组</span><!--]--></a></div><div class="pager" data-v-e257564d><a class="VPLink link pager-link next" href="/c/notes/01_c-basic/07_xdx/" data-v-e257564d><!--[--><span class="desc" data-v-e257564d>下一篇</span><span class="title" data-v-e257564d>函数</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-5d98c3a5 data-v-e315a0ad><div class="container" data-v-e315a0ad><p class="message" data-v-e315a0ad>Released under the MIT License.</p><p class="copyright" data-v-e315a0ad>Copyright © 2024 许大仙</p></div></footer><!--[--><!--]--></div></div>
<script>window.__VP_HASH_MAP__=JSON.parse("{\"index.md\":\"DbLE4H74\",\"notes_01_c-basic_01_xdx_index.md\":\"D_CG5P4p\",\"notes_01_c-basic_02_xdx_index.md\":\"D3Oe8aO6\",\"notes_01_c-basic_03_xdx_index.md\":\"C_nxZAZS\",\"notes_01_c-basic_04_xdx_index.md\":\"DSUjdZCG\",\"notes_01_c-basic_05_xdx_index.md\":\"C0Gj_Tn5\",\"notes_01_c-basic_06_xdx_index.md\":\"Z0IDTw1X\",\"notes_04_linux_01_xdx_index.md\":\"Bpa1Ufo_\",\"notes_index.md\":\"DHYV8jv1\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"zh-CN\",\"dir\":\"ltr\",\"title\":\"\",\"titleTemplate\":\"Hi\",\"description\":\"Java\",\"base\":\"/c/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"lastUpdatedText\":\"\",\"returnToTopLabel\":\"\",\"search\":{\"provider\":\"local\"},\"logo\":\"/logo.svg\",\"nav\":[{\"text\":\"\",\"link\":\"https://aexiar.github.io/\"},{\"text\":\"6\",\"link\":\"https://aexiar.github.io/coa6/notes/\"},{\"text\":\"\",\"items\":[{\"text\":\"c/c++\",\"link\":\"/notes/\"},{\"text\":\"\",\"link\":\"https://aexiar.github.io/web-design/notes/\"},{\"text\":\"Java\",\"link\":\"https://aexiar.github.io/java/notes/\"},{\"text\":\"\",\"link\":\"https://aexiar.github.io/big-data/notes/\"},{\"text\":\"\",\"link\":\"https://aexiar.github.io/linux/notes/\"},{\"text\":\"Go\",\"link\":\"https://aexiar.github.io/go/notes/\"},{\"text\":\"Python\",\"link\":\"https://aexiar.github.io/python/notes/\"}]},{\"text\":\"\",\"link\":\"https://aexiar.github.io/open-software/notes/\"}],\"sidebar\":{\"/notes/\":[{\"text\":\"C \",\"collapsed\":true,\"items\":[{\"text\":\"C \",\"link\":\"/notes/01_c-basic/01_xdx/\"},{\"text\":\"\",\"link\":\"/notes/01_c-basic/02_xdx/\"},{\"text\":\"\",\"link\":\"/notes/01_c-basic/03_xdx/\"},{\"text\":\"\",\"link\":\"/notes/01_c-basic/04_xdx/\"},{\"text\":\"\",\"link\":\"/notes/01_c-basic/05_xdx/\"},{\"text\":\"\",\"link\":\"/notes/01_c-basic/06_xdx/\"},{\"text\":\"\",\"link\":\"/notes/01_c-basic/07_xdx/\"},{\"text\":\"\",\"link\":\"/notes/01_c-basic/08_xdx/\"},{\"text\":\"\",\"link\":\"/notes/01_c-basic/09_xdx/\"},{\"text\":\"\",\"link\":\"/notes/01_c-basic/10_xdx/\"},{\"text\":\"\",\"link\":\"/notes/01_c-basic/11_xdx/\"},{\"text\":\"\",\"link\":\"/notes/01_c-basic/12_xdx/\"},{\"text\":\"gdbmake\",\"link\":\"/notes/01_c-basic/13_xdx/\"},{\"text\":\"\",\"link\":\"/notes/01_c-basic/14_xdx/\"}]},{\"text\":\"C \",\"collapsed\":true,\"items\":[{\"text\":\"\",\"link\":\"/notes/02_c-advance/01_xdx/\"},{\"text\":\"\",\"link\":\"/notes/02_c-advance/02_xdx/\"},{\"text\":\"\",\"link\":\"/notes/02_c-advance/03_xdx/\"},{\"text\":\"\",\"link\":\"/notes/02_c-advance/04_xdx/\"},{\"text\":\"\",\"link\":\"/notes/02_c-advance/05_xdx/\"}]},{\"text\":\"\",\"collapsed\":true,\"items\":[{\"text\":\"meson\",\"collapsed\":true,\"items\":[{\"text\":\"Gradle \",\"link\":\"/notes/03_build/01_xdx/\"}]},{\"text\":\"cmake\",\"collapsed\":true,\"items\":[{\"text\":\"Gradle \",\"link\":\"/notes/03_build/01_xdx/\"}]},{\"text\":\"conan \",\"link\":\"/notes/03_build/01_${commonDirectoryName}/\"},{\"text\":\"Gradle\",\"collapsed\":true,\"items\":[{\"text\":\"Gradle \",\"link\":\"/notes/03_build/01_xdx/\"}]}]},{\"text\":\"Linux\",\"collapsed\":true,\"items\":[{\"text\":\"Linux \",\"link\":\"/notes/04_linux/01_xdx/\"}]},{\"text\":\"C++ \",\"collapsed\":true,\"items\":[]},{\"text\":\"C++ \",\"collapsed\":true,\"items\":[]},{\"text\":\"QT \",\"collapsed\":true,\"items\":[]},{\"text\":\"Linux \",\"collapsed\":true,\"items\":[]}]},\"socialL
</body>
</html>