c++指针

文章目录

    • 解释
      • 什么是指针?
      • 指针的基本语法
      • 示例代码及解释
        • 输出解释
      • 指针的关键特性
      • 指针的常见用途
      • 注意事项
      • 简单练习

#include 
#include 
#include 
using namespace std;

int main() {
    SetConsoleOutputCP(CP_UTF8);  // 设置控制台为 UTF-8 编码

    int num = 10;
    int* p = #  // 指针p指向num的地址

    printf("num 的值: %d\n", num);
    printf("num 的地址: %p\n", &num);
    printf("指针 p 的值 (num 的地址): %p\n", p);
    printf("指针 p 指向的值: %d\n", *p);

    return 0;
}

运行结果示例(具体地址值会因每次运行而不同):

num 的值: 10
num 的地址: 0x7ffee4e0a4ac
指针 p 的值 (num 的地址): 0x7ffee4e0a4ac
指针 p 指向的值: 10

代码工作原理:

  1. 定义变量num并赋值为10
  2. 创建指针p,指向num的内存地址
  3. 打印:
    • num的直接值(10)
    • num的内存地址(使用&运算符获取)
    • p存储的地址值(应该与num的地址相同)
    • p解引用后得到的值(通过*运算符获取,应该为10)

这是一段展示C++中指针基本用法的代码,示范了变量、地址和指针之间的关系。

我来为你详细讲解C++中的指针概念,并结合实际代码示例来说明。

解释

什么是指针?

指针是一个变量,它存储的是另一个变量的内存地址。通过指针,我们可以间接访问和操作内存中的数据。

指针的基本语法

  1. 声明指针

    数据类型 *指针名;
    

    例如:int *p;(声明一个指向整数的指针)

  2. 取地址运算符(&)

    • 获取变量的内存地址
    • 示例:&num 返回变量num的地址
  3. 解引用运算符(*)

    • 访问指针指向地址的值
    • 示例:*p 获取p指向的值

示例代码及解释

以下是一个完整的示例:

#include 
using namespace std;

int main() {
    int num = 10;      // 定义一个整数变量
    int *p = #     // 定义指针p,指向num的地址

    cout << "num 的值: " << num << endl;              // 10
    cout << "num 的地址: " << &num << endl;           // num的内存地址
    cout << "指针 p 的值: " << p << endl;            // p存储的地址(与&num相同)
    cout << "指针 p 指向的值: " << *p << endl;       // 10(通过解引用获取)

    *p = 20;           // 通过指针修改num的值
    cout << "修改后 num 的值: " << num << endl;      // 20

    return 0;
}
输出解释
  • num 的值: 10:直接输出变量的值
  • num 的地址: 0x...:num在内存中的地址(具体值因运行环境不同而变化)
  • 指针 p 的值: 0x...:p存储的地址,与&num相同
  • 指针 p 指向的值: 10:通过*p访问num的值
  • 修改后 num 的值: 20:通过指针修改了num的值

指针的关键特性

  1. 空指针

    int *p = nullptr;  // C++11推荐的空指针写法
    
    • 表示指针不指向任何地址
    • 避免野指针(指向随机内存的指针)
  2. 指针与数组

    • 数组名本质上是一个指向首元素的指针
    int arr[3] = {1, 2, 3};
    int *p = arr;     // p指向arr[0]
    cout << *(p + 1); // 输出2(arr[1])
    
  3. 动态内存分配

    • 使用new分配内存,delete释放内存
    int *p = new int(5);  // 分配内存并初始化为5
    cout << *p << endl;   // 5
    delete p;             // 释放内存
    p = nullptr;          // 防止悬空指针
    

指针的常见用途

  1. 动态内存管理
  2. 数组操作
  3. 函数参数传递(传地址而非值)
  4. 实现数据结构(如链表、树)

注意事项

  1. 未初始化指针

    • 未初始化的指针是危险的,可能指向随机内存
    • 始终初始化为nullptr或有效地址
  2. 悬空指针

    • 指向已释放内存的指针
    • 释放内存后应置为nullptr
  3. 内存泄漏

    • 使用new分配内存后忘记delete会导致内存泄漏

简单练习

尝试理解这段代码:

int x = 5;
int *p1 = &x;
int **p2 = &p1;  // 指向指针的指针
cout << **p2;    // 输出5
  • p1是指向x的指针
  • p2是指向p1的指针(二级指针)
  • **p2两次解引用得到x的值

如果你有任何具体问题或想深入某个方面,请告诉我!

你可能感兴趣的:(c++,开发语言)