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

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

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

1. 基本概念

指针的定义和声明

1

2

intx = 10;// 普通变量

int*ptr = &x;// 指针变量,存储x的地址

  • *表示声明一个指针
  • &是取地址运算符
  • ptr存储的是x的内存地址
  • *ptr是解引用,获取该地址存储的值

2. 指针的基本操作

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#include <iostream>

usingnamespacestd;

intmain() {

intx = 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

return0;

}

3. 指针类型

空指针

1

2

3

int*ptr = nullptr;// C++11及以后推荐

int*ptr = 0;// 传统方式

int*ptr = NULL;// C风格,不推荐在C++中使用

悬空指针(野指针)

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

1

2

3

4

int*ptr =newint(10);

deleteptr;

// ptr现在成为悬空指针,应该避免使用

ptr = nullptr;// 好习惯:释放后置为空

4. 指针运算

1

2

3

4

5

6

7

8

9

intarr[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. 动态内存分配

1

2

3

4

5

6

7

8

9

10

11

12

// 分配单个变量

int*p =newint;// 分配内存

*p = 100;// 赋值

deletep;// 释放内存

p = nullptr;// 置空

// 分配数组

int*arr =newint[5];// 分配5个int的空间

for(inti = 0; i < 5; i++) {

arr[i] = i * 10;

}

delete[] arr;// 释放数组内存

6. 多级指针

1

2

3

4

5

6

7

8

9

intx = 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. 指针和函数

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

1

2

3

4

5

6

7

8

9

10

11

12

voidswap(int*a,int*b) {

inttemp = *a;

*a = *b;

*b = temp;

}

intmain() {

intx = 5, y = 10;

swap(&x, &y);// 传递地址

cout << x <<", "<< y << endl;// 输出: 10, 5

return0;

}

返回指针的函数

1

2

3

4

5

6

7

8

9

int* createArray(intsize) {

returnnewint[size];// 返回动态数组的指针

}

// 注意:不要返回局部变量的地址

int* badFunction() {

intx = 10;

return&x;// 错误!x在函数结束后被销毁

}

8. 指针和数组

1

2

3

4

5

6

7

8

9

intarr[3] = {1, 2, 3};

// 数组名在多数情况下退化为指针

int*ptr = arr;// 等价于 int *ptr = &arr[0];

// 通过指针遍历数组

for(inti = 0; i < 3; i++) {

cout << *(ptr + i) <<" ";// 输出: 1 2 3

}

9. const 和指针

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

intx = 10;

inty = 20;

// 指向常量的指针(不能通过指针修改值)

constint*ptr1 = &x;

// *ptr1 = 30; // 错误!

ptr1 = &y;// 正确:可以改变指向

// 常量指针(不能改变指向)

int*constptr2 = &x;

*ptr2 = 30;// 正确:可以修改值

// ptr2 = &y; // 错误!

// 指向常量的常量指针

constint*constptr3 = &x;

// *ptr3 = 30; // 错误!

// ptr3 = &y; // 错误!

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

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

1

2

3

4

5

6

7

8

9

10

11

#include <memory>

// unique_ptr:独占所有权

std::unique_ptr<int> uptr(newint(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;


http://www.rkmt.cn/news/1431119.html

相关文章:

  • Windows凭据窃取技术:从SAM数据库提取密码哈希
  • 2026服表培训高评价机构判定:导演培训、戏剧表演培训、配音培训、中日双语播音培训、创尚双语播音怎么样、创尚怎么样选择指南 - 优质品牌商家
  • 别再只用XGBoost了!LightGBM实战调参保姆级指南(附Python代码)
  • 重庆洋酒回收机构排行:重庆红酒回收/重庆老酒回收/重庆茅台酒上门回收/重庆茅台酒回收/2026年靠谱选择推荐 - 优质品牌商家
  • 给洪水预报‘纠偏’:手把手教你用Python实现数值降雨预报的线性缩放(LS)与分位数映射(QM)校正
  • 从‘搞死主机’到‘一次成功’:我的Linux硬盘挂载血泪史与终极UUID配置指南
  • Acer老本装Ubuntu 20.04,WiFi驱动死活不认?我靠这几步终于搞定(附NetworkManager急救法)
  • 6款精品降AI率平台 改写实力出众
  • 别再死记硬背了!用OpenCV+Python搞定相机标定,从棋盘格到内参矩阵的保姆级实战
  • 2026年Q2内墙涂料珍珠泥实测评测:混凝土外加剂、渗透结晶防水材料、纳米抗裂减渗剂、聚丙烯抗裂纤维、自愈合抑温防水材料选择指南 - 优质品牌商家
  • TimeMixer终极指南:如何用MLP架构实现多尺度时间序列预测的3大突破
  • 2026年必看!匹克球运动装供应商口碑推荐榜单新鲜出炉
  • WENO-L方法在双马赫反射问题中的应用与优化
  • 别再乱用yum clean all了!保姆级教程教你正确管理CentOS/RHEL的yum缓存(附磁盘空间清理实战)
  • AI科技热点日报 | 2026年5月30日
  • Claude Code 从零到上手指南:国产工具链复现80% Agent能力,DeepSeek+LangChain实战
  • 基于小程序的大学生竞赛管理系统毕设
  • Unity材质球大合集
  • 3个核心特性揭秘:Scarab如何重塑空洞骑士模组管理体验
  • 从入门到精通:PyBaMM电池建模实战指南与性能优化技巧
  • 子图同构问题的表格化并行解法Δ-Motif解析
  • 告别网盘限速:九大主流网盘直链下载助手使用全攻略
  • Android FBE密钥存储与生命周期全解析
  • 2026年Q2山东出国工作市场深度解析:如何选择可靠的服务合作伙伴 - 2026年企业资讯
  • LangChain 完全入门指南:从零搭建大模型应用
  • 手把手解决Ubuntu 20.04/22.04上Isaac Gym的Segmentation fault (core dumped):从vulkan库安装到prime-select避坑指南
  • 【Go实战】百万级并发不崩盘!用Worker Pool和Context驯服你的Goroutine
  • OnmyojiAutoScript每日领黑蛋功能深度解析:从异常诊断到架构优化实战
  • ARM TrustZone与TEE:Android安全基石深度解析
  • 2026年Q2特殊不锈钢管厂家选型核心技术维度解析 - 优质品牌商家