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语言实现五子棋功能全解析

    C语言实现五子棋功能全解析

    五子棋是经典的棋牌类游戏,很多人都玩过,那么如何用Python实现五子棋呢,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • c++ 结构体内存对齐基本概念及示例

    c++ 结构体内存对齐基本概念及示例

    这篇文章主要介绍了c++ 结构体内存对齐基本概念及示例,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-12-12
  • C语言关于include顺序不同导致编译结果不同的问题

    C语言关于include顺序不同导致编译结果不同的问题

    这篇文章主要介绍了在日常调试C语言中include的顺序不同从而影响最后编译结果不同的问题,究其原因是写代码的习惯所导致,下面跟小编一起来看看吧
    2022-04-04
  • C++虚函数表的原理与使用解析

    C++虚函数表的原理与使用解析

    对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。本文就将详细讲讲虚函数表的原理与使用,需要的可以参考一下
    2022-04-04
  • C语言打印杨辉三角形的示例代码

    C语言打印杨辉三角形的示例代码

    杨辉三角形,又称帕斯卡三角形、贾宪三角形、海亚姆三角形,它的排列形如三角形。本文将为大家介绍通过C语言实现打印杨辉三角形的示例代码,需要的可以参考一下
    2022-02-02
  • C++实现本地TCP通讯的示例代码

    C++实现本地TCP通讯的示例代码

    这篇文章主要为大家详细介绍了C++如何利用TCP技术,实现本地ROS1和ROS2的通讯,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • 深入C++中struct与class的区别分析

    深入C++中struct与class的区别分析

    本篇文章是对C++中struct与class的区别进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 深入了解C++的多态与虚函数

    深入了解C++的多态与虚函数

    这篇文章主要为大家详细介绍了C++多态与虚函数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-07-07
  • C++ TensorflowLite模型验证的过程详解

    C++ TensorflowLite模型验证的过程详解

    这篇文章给大家介绍了C++ TensorflowLite模型验证的过程,测试代码,主要是RunInference()和read_file(),详细操作过程跟随小编一起看看吧
    2021-08-08
  • Qt实现SqlTableModel映射组件应用小结

    Qt实现SqlTableModel映射组件应用小结

    在Qt中提供了QSqlTableModel模型类,它为开发者提供了一种直观的方式来与数据库表格进行交互,本文就来介绍一下Qt实现SqlTableModel映射组件应用小结,感兴趣的可以了解一下
    2023-12-12

最新评论