当前位置: 首页 > news >正文

C++中的指针 之一

在C++中,指针是一种用于存储内存地址的变量。

通过指针,可以间接访问和操作其他变量或对象。以下是关于指针类型定义及赋值的总结:


1. 指针的定义

指针是一个变量,其值为另一个变量的内存地址。指针本身也有自己的内存地址,但它的内容是所指向对象的地址。

2. 指针的声明语法

类型 *指针名;       // 例如:int *ptr;   double *p;
  • 星号 * 的位置可以靠近类型(int* ptr)或靠近变量名(int *ptr),两者含义相同,但建议保持代码风格一致。
  • 指针的类型决定了它能指向什么类型的变量(例如 int* 只能指向 int 类型的变量)。

3. 指针的初始化

指针在使用前必须被初始化,否则会成为“野指针”,解引用野指针会导致未定义行为。初始化方式有以下几种:

(1) 使用地址运算符 & 获取变量的地址

int a = 10;
int *ptr = &a;   // ptr 指向变量 a

(2) 动态内存分配(new 运算符)

int *ptr = new int(20);   // 分配内存并初始化为 20
delete ptr;               // 使用完后释放内存

(3) 赋值为另一个指针

int a = 10;
int *p1 = &a;
int *p2 = p1;   // p2 也指向 a

(4) 初始化为空指针

  • C++11 之前:int *ptr = NULL;int *ptr = 0;
  • C++11 及以后:推荐使用 nullptr
int *ptr = nullptr;   // 空指针,不指向任何有效地址

4. 指针的赋值

  • 相同类型的指针之间可以直接赋值
    int a = 10;
    int *p1 = &a;
    int *p2 = p1;   // 合法,p2 也指向 a
    
  • 不同类型的指针不能直接赋值(除非使用强制类型转换,但通常不安全):
    int a = 10;
    double *p = &a;   // 错误:类型不匹配
    
  • 不能将整数值直接赋给指针(除非强制转换,但极少使用且危险):
    int *p = 100;     // 错误:不能将 int 转换为 int*
    
    若确实需要让指针指向特定地址(如硬件编程),可使用 reinterpret_cast,但必须确保地址有效。
  • void 指针void* 可以存储任何类型的地址,但不能直接解引用,需先转换为具体类型:
    int a = 10;
    void *vp = &a;                // 合法
    // cout << *vp;               // 错误:不能解引用 void*
    int *ip = static_cast<int*>(vp);  // 转换为 int* 后再解引用
    

5. 指针的常用操作

  • 解引用:使用 * 运算符访问指针指向的对象。
    int a = 10;
    int *p = &a;
    cout << *p;   // 输出 10
    *p = 20;      // 修改 a 的值为 20
    
  • 指针运算:对数组指针可以进行加减运算,移动指向的位置。
    int arr[5] = {1,2,3,4,5};
    int *p = arr;        // 指向数组第一个元素
    p++;                 // 指向第二个元素
    cout << *p;          // 输出 2
    
  • 指针比较:可以比较两个指针的地址大小,通常用于数组遍历。

6. 指针的常见类型

  • 常量指针:指针本身是常量,不能改变指向的地址。
    int a = 10, b = 20;
    int *const p = &a;   // p 始终指向 a
    // p = &b;           // 错误
    *p = 30;             // 可以修改 a 的值
    
  • 指向常量的指针:不能通过指针修改所指向的值,但可以改变指向。
    const int a = 10;
    const int *p = &a;   // 或 int const *p
    // *p = 20;          // 错误
    p = &b;              // 可以,但 b 也必须是 const int 类型
    
  • 指向常量的常量指针:两者都不能改变。
    const int a = 10;
    const int *const p = &a;
    

7. 注意事项

  • 空指针不能解引用:解引用 nullptr 会导致程序崩溃。
  • 避免悬空指针:当指针指向的内存被释放后,应将指针置为 nullptr,防止误用。
  • 指针与数组:数组名在大多数情况下会退化为指向第一个元素的指针,但数组名本身不是指针变量。
  • 指针与引用:引用是变量的别名,必须初始化且不能改变绑定;指针可以重新赋值,可以为空。

以上是C++中指针类型定义及赋值的基本总结。掌握指针是理解C++内存管理和高效编程的关键,但务必谨慎操作以避免错误。

http://www.jsqmd.com/news/387632/

相关文章:

  • 2026最新AI大模型应用开发的核心技术学习线路看这里,程序员小白必看:大模型应用开发,收藏这份超全学习指南!
  • WebFlux vs MVC:Gateway集成若依框架的技术选型之争 - 实践
  • 掌握应用开发学习路线,大模型开发入门指南:小白也能轻松掌握的AI应用开发流程与实战(收藏版)
  • C++中的指针
  • prompt实践
  • AI_Agent也有体检中心了?AgentDoG开源框架,带你入门智能体安全防护
  • GLM-5与MiniMax-M2.5性能对比,小白程序员必看(收藏版)
  • CppCon 2025 学习:C++23 deducing this
  • 2026 Agent元年!小白程序员必备:大模型学习路线图+精选资源,收藏这份高薪指南!
  • AI大模型从入门到精通:小白程序员必备学习路线(2026最新版)
  • 导师严选!继续教育专用AI论文软件 千笔·专业学术智能体 VS 学术猹
  • Comsol流固耦合注浆及冒浆分析。 采用其中达西定律模块及固体力学模块,通过建立质量源项、体...
  • 信息论与编码篇---欧式距离
  • 学长亲荐!更贴合研究生需求的降AI率平台,千笔·降AI率助手 VS 云笔AI
  • 导师严选! AI论文平台 千笔写作工具 VS WPS AI 更贴合自考需求
  • [NOIP2025 T2] 清仓甩卖 题解
  • 告别低效繁琐!降AI率平台 千笔·专业降AI率智能体 VS 文途AI
  • 实测对比后!千笔·专业学术智能体,专科生论文写作神器
  • 隧道内车距监测,低光环境测距防追尾,输出安全提醒。
  • 江苏美学植发医院排行更新,2026年这些医院上榜,植发/微针植发/发际线种植/美学植发/不剃发植发,美学植发机构推荐排行 - 品牌推荐师
  • 数据结构DS-KMP算法(c++实现)
  • 一键关闭Win杀毒和禁止系统更新,Windows轻松设置
  • SpringBoot智能图书馆座位预约管理系统开题报告
  • 2026年1月清障车实力厂家排行榜单,这些品牌不容错过!3万左右清障车/蓝牌重载清障车,清障车源头厂家哪个好 - 品牌推荐师
  • MG-Nav: 基于稀疏空间记忆的双尺度视觉导航 论文阅读 - 详解
  • 2026最新!8个一键生成论文工具测评:专科生毕业论文+开题报告写作全攻略
  • AtCoder Beginner Contest 445
  • 物理机理嵌入和自适应学习的机械早期故障诊断(Python)
  • 别再瞎找了!10个AI论文软件深度测评,自考毕业论文写作必备工具推荐
  • 交稿前一晚!10个降AIGC平台深度测评与推荐——MBA必看