当前位置: 首页 > 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.jsqmd.com/news/919796/

相关文章:

  • 2026年山东刺绣贴排行榜,亲测分享实践心得
  • 使用 iNaturalist.org 的 OF (Observation Field 观察字段) 的注意事项
  • 2026年好用的打磨抛光品牌商排名,靠谱的在这里 - mypinpai
  • AMD Ryzen处理器深度调试指南:5个SMU系统管理单元优化实战技巧
  • 3步搞定MOOC课程离线下载:免费建立个人学习资源库
  • Lindy下一代架构选型尘埃落定?4大备选方案终局分析,附迁移成本测算表(限前500名领取)
  • 避开这些坑!基因家族染色体位置分析中GFF文件与基因ID匹配的常见错误
  • Windows凭据窃取技术:从SAM数据库提取密码哈希
  • 别再用MLP了?KAN模型实战:用Python复现论文核心,实测速度到底慢多少
  • 【分享】种子磁力下载器1.7.2 解锁年费会员 不限速下载
  • AI编程8:百度的Baidu Comate(文心快码)
  • claude code 消息系统 Skill 调用(五)
  • 2026年5月,如何选择一家靠谱的调压阀SDR系列定制厂家? - 2026年企业资讯
  • 2026年Q2义乌抖音商城培训选校核心技术维度解析:金华跨境电商培训/金华跨境电商运营培训/金华速卖通培训/金华阿里巴巴国际站培训/选择指南 - 优质品牌商家
  • 多模型搭配使用,如何放大 GPT5.5 在办公场景的价值
  • 别再只用XGBoost了!LightGBM实战调参保姆级指南(附Python代码)
  • 2026 苏州防水补漏靠谱品牌榜单 结合各区建筑特点根治反复渗漏 - 吉修匠
  • 2026服表培训高评价机构判定:导演培训、戏剧表演培训、配音培训、中日双语播音培训、创尚双语播音怎么样、创尚怎么样选择指南 - 优质品牌商家
  • 从‘搞死主机’到‘一次成功’:我的Linux硬盘挂载血泪史与终极UUID配置指南
  • 给洪水预报‘纠偏’:手把手教你用Python实现数值降雨预报的线性缩放(LS)与分位数映射(QM)校正
  • 番茄小说下载器终极指南:如何快速将网络小说转为本地电子书
  • 重庆洋酒回收机构排行:重庆红酒回收/重庆老酒回收/重庆茅台酒上门回收/重庆茅台酒回收/2026年靠谱选择推荐 - 优质品牌商家
  • 涂胶机品牌哪家好?瑞德佑业是您的靠谱之选 - mypinpai
  • D3KeyHelper终极指南:5分钟掌握暗黑3自动化操作,告别手动重复点击
  • 企业认证与安全体系(四):企业登录认证流程全解析——JWT、Redis、Spring Security 如何协同工作?
  • Acer老本装Ubuntu 20.04,WiFi驱动死活不认?我靠这几步终于搞定(附NetworkManager急救法)
  • 6款精品降AI率平台 改写实力出众
  • 为什么你的Gemini需求总被算法团队拒收?曝光5个技术负责人绝不明说但必查的PRD硬伤
  • 2026年兰州装修公司费用一览,哪家性价比高? - mypinpai
  • 2026年Q2内墙涂料珍珠泥实测评测:混凝土外加剂、渗透结晶防水材料、纳米抗裂减渗剂、聚丙烯抗裂纤维、自愈合抑温防水材料选择指南 - 优质品牌商家