白色海韵 發表於 2026-1-7 11:00:45

C++中指针变量的使用指南

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>1. 基本概念</li><ul class="second_class_ul"><li>指针的定义和声明</li></ul><li>2. 指针的基本操作</li><ul class="second_class_ul"></ul><li>3. 指针类型</li><ul class="second_class_ul"><li>空指针</li><li>悬空指针(野指针)</li></ul><li>4. 指针运算</li><ul class="second_class_ul"></ul><li>5. 动态内存分配</li><ul class="second_class_ul"></ul><li>6. 多级指针</li><ul class="second_class_ul"></ul><li>7. 指针和函数</li><ul class="second_class_ul"></ul><li>8. 指针和数组</li><ul class="second_class_ul"></ul><li>9. const 和指针</li><ul class="second_class_ul"></ul><li>10. 智能指针(C++11及以上)</li><ul class="second_class_ul"></ul></ul></div><p>指针是C++中的一个核心概念,它存储的是内存地址,而不是实际的值。理解指针对于掌握C++编程至关重要。</p>
<p class="maodian"></p><h2>1. 基本概念</h2>
<p class="maodian"></p><h3>指针的定义和声明</h3>
<div class="jb51code"><pre class="brush:cpp;">int x = 10;         // 普通变量
int *ptr = &amp;x;      // 指针变量,存储x的地址
</pre></div>
<ul><li><code>*</code>表示声明一个指针</li><li><code>&amp;</code> 是取地址运算符</li><li><code>ptr</code> 存储的是 <code>x</code> 的内存地址</li><li><code>*ptr</code> 是解引用,获取该地址存储的值</li></ul>
<p class="maodian"></p><h2>2. 指针的基本操作</h2>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;iostream&gt;
using namespace std;

int main() {
    int x = 10;
    int *ptr = &amp;x;      // ptr指向x
   
    cout &lt;&lt; "x的值: " &lt;&lt; x &lt;&lt; endl;         // 输出: 10
    cout &lt;&lt; "x的地址: " &lt;&lt; &amp;x &lt;&lt; endl;      // 输出: x的地址
    cout &lt;&lt; "ptr的值: " &lt;&lt; ptr &lt;&lt; endl;       // 输出: x的地址
    cout &lt;&lt; "*ptr的值: " &lt;&lt; *ptr &lt;&lt; endl;   // 输出: 10
   
    *ptr = 20;// 通过指针修改x的值
    cout &lt;&lt; "修改后x的值: " &lt;&lt; x &lt;&lt; endl;   // 输出: 20
   
    return 0;
}
</pre></div>
<p class="maodian"></p><h2>3. 指针类型</h2>
<p class="maodian"></p><h3>空指针</h3>
<div class="jb51code"><pre class="brush:cpp;">int *ptr = nullptr;// C++11及以后推荐
int *ptr = 0;      // 传统方式
int *ptr = NULL;   // C风格,不推荐在C++中使用
</pre></div>
<p class="maodian"></p><h3>悬空指针(野指针)</h3>
<p>指向已释放内存的指针,使用会导致未定义行为:</p>
<div class="jb51code"><pre class="brush:cpp;">int *ptr = new int(10);
delete ptr;
// ptr现在成为悬空指针,应该避免使用
ptr = nullptr;// 好习惯:释放后置为空
</pre></div>
<p class="maodian"></p><h2>4. 指针运算</h2>
<div class="jb51code"><pre class="brush:cpp;">int arr = {1, 2, 3, 4, 5};
int *ptr = arr;// 指向数组首元素

cout &lt;&lt; *ptr &lt;&lt; endl;      // 输出: 1
cout &lt;&lt; *(ptr + 1) &lt;&lt; endl;// 输出: 2(指针加法)
cout &lt;&lt; ptr &lt;&lt; endl;    // 输出: 3(数组语法)

ptr++;// 移动到下一个元素
cout &lt;&lt; *ptr &lt;&lt; endl;      // 输出: 2
</pre></div>
<p class="maodian"></p><h2>5. 动态内存分配</h2>
<div class="jb51code"><pre class="brush:cpp;">// 分配单个变量
int *p = new int;          // 分配内存
*p = 100;                  // 赋值
delete p;                  // 释放内存
p = nullptr;               // 置空

// 分配数组
int *arr = new int;   // 分配5个int的空间
for (int i = 0; i &lt; 5; i++) {
    arr = i * 10;
}
delete[] arr;            // 释放数组内存
</pre></div>
<p class="maodian"></p><h2>6. 多级指针</h2>
<div class="jb51code"><pre class="brush:cpp;">int x = 10;
int *p = &amp;x;       // 一级指针
int **pp = &amp;p;   // 二级指针
int ***ppp = &amp;pp;// 三级指针

cout &lt;&lt; x &lt;&lt; endl;      // 10
cout &lt;&lt; *p &lt;&lt; endl;   // 10
cout &lt;&lt; **pp &lt;&lt; endl;   // 10
cout &lt;&lt; ***ppp &lt;&lt; endl; // 10
</pre></div>
<p class="maodian"></p><h2>7. 指针和函数</h2>
<p>指针作为函数参数(按地址传递)</p>
<div class="jb51code"><pre class="brush:cpp;">void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5, y = 10;
    swap(&amp;x, &amp;y);// 传递地址
    cout &lt;&lt; x &lt;&lt; ", " &lt;&lt; y &lt;&lt; endl;// 输出: 10, 5
    return 0;
}
</pre></div>
<p><strong>返回指针的函数</strong></p>
<div class="jb51code"><pre class="brush:cpp;">int* createArray(int size) {
    return new int;// 返回动态数组的指针
}

// 注意:不要返回局部变量的地址
int* badFunction() {
    int x = 10;
    return &amp;x;// 错误!x在函数结束后被销毁
}
</pre></div>
<p class="maodian"></p><h2>8. 指针和数组</h2>
<div class="jb51code"><pre class="brush:cpp;">int arr = {1, 2, 3};

// 数组名在多数情况下退化为指针
int *ptr = arr;// 等价于 int *ptr = &amp;arr;

// 通过指针遍历数组
for (int i = 0; i &lt; 3; i++) {
    cout &lt;&lt; *(ptr + i) &lt;&lt; " ";// 输出: 1 2 3
}
</pre></div>
<p class="maodian"></p><h2>9. const 和指针</h2>
<div class="jb51code"><pre class="brush:cpp;">int x = 10;
int y = 20;

// 指向常量的指针(不能通过指针修改值)
const int *ptr1 = &amp;x;
// *ptr1 = 30;// 错误!
ptr1 = &amp;y;      // 正确:可以改变指向

// 常量指针(不能改变指向)
int *const ptr2 = &amp;x;
*ptr2 = 30;   // 正确:可以修改值
// ptr2 = &amp;y;   // 错误!

// 指向常量的常量指针
const int *const ptr3 = &amp;x;
// *ptr3 = 30;// 错误!
// ptr3 = &amp;y;   // 错误!
</pre></div>
<p class="maodian"></p><h2>10. 智能指针(C++11及以上)</h2>
<p>智能指针自动管理内存,避免内存泄漏:</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;memory&gt;

// unique_ptr:独占所有权
std::unique_ptr&lt;int&gt; uptr(new int(10));

// shared_ptr:共享所有权
std::shared_ptr&lt;int&gt; sptr1 = std::make_shared&lt;int&gt;(20);
std::shared_ptr&lt;int&gt; sptr2 = sptr1;// 引用计数增加

// weak_ptr:弱引用,不增加引用计数
std::weak_ptr&lt;int&gt; wptr = sptr1;
</pre></div>
<p>到此这篇关于C++中指针变量的使用指南的文章就介绍到这了,更多相关C++ 指针变量内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>深入解读C++中的指针变量</li><li>C++用指针变量作为函数的参数接受数组的值的问题详细总结</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: C++中指针变量的使用指南