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

 更新时间:2026年01月07日 11:00:45   作者:司徒轩宇  
本文主要介绍了C++中的指针变量,主要包括基本操作、类型、运算、动态内存分配、多级指针、函数指针、与数组的使用、常量指针以及智能指针等,感兴趣的可以了解一下

指针是C++中的一个核心概念,它存储的是内存地址,而不是实际的值。理解指针对于掌握C++编程至关重要。

1. 基本概念

指针的定义和声明

int x = 10;         // 普通变量
int *ptr = &x;      // 指针变量,存储x的地址
  • *表示声明一个指针
  • & 是取地址运算符
  • ptr 存储的是 x 的内存地址
  • *ptr 是解引用,获取该地址存储的值

2. 指针的基本操作

#include <iostream>
using namespace std;

int main() {
    int x = 10;
    int *ptr = &x;      // ptr指向x
    
    cout << "x的值: " << x << endl;           // 输出: 10
    cout << "x的地址: " << &x << endl;        // 输出: x的地址
    cout << "ptr的值: " << ptr << endl;       // 输出: x的地址
    cout << "*ptr的值: " << *ptr << endl;     // 输出: 10
    
    *ptr = 20;  // 通过指针修改x的值
    cout << "修改后x的值: " << x << endl;     // 输出: 20
    
    return 0;
}

3. 指针类型

空指针

int *ptr = nullptr;  // C++11及以后推荐
int *ptr = 0;        // 传统方式
int *ptr = NULL;     // C风格,不推荐在C++中使用

悬空指针(野指针)

指向已释放内存的指针,使用会导致未定义行为:

int *ptr = new int(10);
delete ptr;
// ptr现在成为悬空指针,应该避免使用
ptr = nullptr;  // 好习惯:释放后置为空

4. 指针运算

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;  // 指向数组首元素

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

ptr++;  // 移动到下一个元素
cout << *ptr << endl;      // 输出: 2

5. 动态内存分配

// 分配单个变量
int *p = new int;          // 分配内存
*p = 100;                  // 赋值
delete p;                  // 释放内存
p = nullptr;               // 置空

// 分配数组
int *arr = new int[5];     // 分配5个int的空间
for (int i = 0; i < 5; i++) {
    arr[i] = i * 10;
}
delete[] arr;              // 释放数组内存

6. 多级指针

int x = 10;
int *p = &x;       // 一级指针
int **pp = &p;     // 二级指针
int ***ppp = &pp;  // 三级指针

cout << x << endl;      // 10
cout << *p << endl;     // 10
cout << **pp << endl;   // 10
cout << ***ppp << endl; // 10

7. 指针和函数

指针作为函数参数(按地址传递)

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5, y = 10;
    swap(&x, &y);  // 传递地址
    cout << x << ", " << y << endl;  // 输出: 10, 5
    return 0;
}

返回指针的函数

int* createArray(int size) {
    return new int[size];  // 返回动态数组的指针
}

// 注意:不要返回局部变量的地址
int* badFunction() {
    int x = 10;
    return &x;  // 错误!x在函数结束后被销毁
}

8. 指针和数组

int arr[3] = {1, 2, 3};

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

// 通过指针遍历数组
for (int i = 0; i < 3; i++) {
    cout << *(ptr + i) << " ";  // 输出: 1 2 3
}

9. const 和指针

int x = 10;
int y = 20;

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

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

// 指向常量的常量指针
const int *const ptr3 = &x;
// *ptr3 = 30;  // 错误!
// ptr3 = &y;   // 错误!

10. 智能指针(C++11及以上)

智能指针自动管理内存,避免内存泄漏:

#include <memory>

// unique_ptr:独占所有权
std::unique_ptr<int> uptr(new int(10));

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

// weak_ptr:弱引用,不增加引用计数
std::weak_ptr<int> wptr = sptr1;

到此这篇关于C++中指针变量的使用指南的文章就介绍到这了,更多相关C++ 指针变量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++自定义(手撕)vector类实现过程

    C++自定义(手撕)vector类实现过程

    文章介绍了C++中std::vector的简化实现,涵盖模板类定义、动态数组管理、构造析构函数、深拷贝机制、迭代器及容量操作等核心内容,旨在通过手动实现理解其内存管理原理和底层实现逻辑
    2025-09-09
  • C++中的模板template小结

    C++中的模板template小结

    这篇文章主要介绍了C++中的模板template的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • C++初始化数组的几种常见方法(简单易懂)

    C++初始化数组的几种常见方法(简单易懂)

    本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array和std::vector进行静态和动态初始化的方式,需要的朋友可以参考下
    2025-02-02
  • C++调用Python基础功能实例详解

    C++调用Python基础功能实例详解

    c++调用Python首先安装Python,本文以win7为例,给大家详细介绍C++调用Python基础功能,需要的朋友参考下吧
    2017-04-04
  • C语言实现哈夫曼树的构建

    C语言实现哈夫曼树的构建

    这篇文章主要为大家详细介绍了C语言实现哈夫曼树的构建,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C++中的unordered_map用法

    C++中的unordered_map用法

    当你在C++中需要使用哈希表(无序映射)来管理键值对时,unordered_map 是一个非常有用的数据结构,本文主要介绍了C++中的unordered_map用法,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • C++用两个栈实现一个队列(面试官的小结)

    C++用两个栈实现一个队列(面试官的小结)

    这篇文章主要给大家介绍了关于C++用两个栈实现一个队列的相关资料,这是来自一名面试官的小结,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • matlab模拟退火算法单约束车间流水线调度解决实现及示例

    matlab模拟退火算法单约束车间流水线调度解决实现及示例

    这篇文章主要为大家介绍了matlab模拟退火算法求解单约束车间流水线调度的实现及示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • C++ 实现桶排序的示例代码

    C++ 实现桶排序的示例代码

    桶排序或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子,本文详细的介绍了如何实现,感兴趣的可以了解一下
    2021-07-07
  • 深入理解C++中的vector类的用法及特性

    深入理解C++中的vector类的用法及特性

    vector直接翻译过来为向量,在C++中为封装动态数组的容器,且有序,需要的朋友可以参考下
    2016-05-05

最新评论