C++ 指针基础:开启内存操控之门

news/2025/1/13 12:48:07/
1. 指针为何如此重要

在 C++ 编程领域,指针堪称一项极为关键的特性。它赋予了程序员直接访问和操控内存的能力,这使得程序在处理复杂数据结构与优化性能时具有更高的灵活性。想象一下,在编写大型程序时,高效地管理内存资源是多么重要,而指针就是实现这一目标的有力工具。例如,在处理链表、树等动态数据结构时,指针能够帮助我们轻松地构建和遍历这些结构,极大地提高编程效率。

2. 指针基础:声明与初始化

指针本质上是一种变量,它存储的是其他变量在内存中的地址。要声明一个指针,需在类型名称后加上*。例如,声明一个指向int类型的指针:

int *ptr;

这里,ptr就是一个指向int类型数据的指针变量。然而,此时ptr并未指向任何有效的内存地址,这就需要对其进行初始化。
初始化指针有两种常见方式。一种是让它指向一个已存在的变量:

int num = 10;
int *ptr = #

 

这里的&是取地址运算符,它获取num变量的内存地址,并将其赋值给指针ptr,这样ptr就指向了num

另一种初始化指针的方式是在动态分配内存时进行:

int *ptr = new int;
*ptr = 20;

new int在堆内存中分配了一块用于存储int类型数据的空间,并返回该空间的地址,赋值给ptr。然后通过解引用ptr(即*ptr)来给这块内存赋值。

3. 指针解引用:访问内存中的值

一旦指针指向了某个内存地址,我们就可以通过解引用运算符*来访问该地址中存储的值。例如:

int num = 10;
int *ptr = #
std::cout << "通过指针访问的值: " << *ptr << std::endl;

 这里*ptr表示获取ptr所指向的内存地址中的值,也就是num的值。不仅如此,我们还能通过指针修改所指向的值:

*ptr = 30;
std::cout << "修改后的值: " << num << std::endl;

 

可以看到,通过修改*ptr,实际上修改了num的值,因为ptr指向了num的内存地址。

4. 指针与数组的紧密联系

在 C++ 中,数组与指针有着千丝万缕的联系。数组名本身就可以看作是一个指向数组首元素的常量指针。例如:

int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr;

 这里arrptr都指向数组arr的首元素arr[0]。通过指针来访问数组元素,可以使用偏移量的方式:

for (int i = 0; i < 5; ++i) {std::cout << *(ptr + i) << " ";
}

ptr + i表示从指针ptr(即数组首元素地址)开始,偏移i个元素的地址,*(ptr + i)则获取该地址处的值,即arr[i]

5. 总结

指针作为 C++ 的重要特性,为我们提供了深入内存操作的能力。理解指针的声明、初始化、解引用以及与数组的关系,是迈向 C++ 高级编程的重要一步。在后续的学习中,我们将进一步探索指针在动态内存管理、函数指针等方面的应用。


http://www.ppmy.cn/news/1558210.html

相关文章

mac中idea中英文版本切换

1.快捷键command&#xff0c;或者 2.找到插件&#xff08;plugins&#xff09;&#xff0c;搜索chinese&#xff0c;安装 第一次安装好点击应用会提示重启&#xff0c;直接重启就好了&#xff0c;如果已经安装过&#xff0c;只需要切换中英文 3.中英文切换 外观与行为&#xf…

Halcon 的标定

*窗口坐标 宽度 dev_update_window(off)Halcon winw:=10000 winh:=10000 dev_open_window(0, 0, 1000, 1000, black, WindowHandle) dev_set_part(0,0,winw,winh) set_system (clip_region, false) dev_clear_window() dev_set_draw (margin) gen_region_line(xaxis, 0, 0, …

tokenizer、tokenizer.encode、tokenizer.encode_plus比较

一、概念 在我们使用Transformers库进行自然语言处理任务建模的过程中&#xff0c;基本离不开Tokenizer类。我们需要这些Tokenizer类来帮助我们加载预训练模型的分词模块&#xff0c;并将文本转化为预训练模型可接受的输入格式。 而在实际建模的实践中&#xff0c;我们参考优秀…

【笔记】如何在ubuntu中设置静态ip地址

连接finalshell发现ip地址总变连接起来十分的麻烦 首先是进入ubuntu的网络配置文件 sudo vim /etc/netplan/01-network-manager-all.yaml 默认只有前面那三行 后面的需要自己添加 network: version: 2 renderer: NetworkManager ethernets: ens33: dhcp4:…

MySQL-MVCC(多版本并发控制)

MySQL中的MVCC&#xff08;Multi-Version Concurrency Control&#xff09;是一种并发控制机制&#xff0c;用于提供读-写冲突时的可靠读取。 MVCC通过保存数据在某个时间点的快照来实现这一点&#xff0c;从而避免了传统的锁定方法。在InnoDB存储引擎中&#xff0c;MVCC是通过…

使用envoyfilter添加请求头

该envoyfilter实现了这样一个功能&#xff0c;如果请求头中含有Sw8&#xff0c;则添加请求头HasSw8: true。 1. 内嵌lua脚本 apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata:name: add-header-filternamespace: demo-bookinfo # 可根据实际情况调整命…

React 前端框架入门

这里写目录标题 React 前端框架入门什么是 React&#xff1f;核心特性基本概念1. JSX2. 组件3. State 和 Props4. 生命周期5. React Hooks React 应用示例项目结构如何启动 React 项目参考资料 React 前端框架入门 什么是 React&#xff1f; React 是由 Facebook 开发并开源的…

【JAVA高级篇教学】第五篇:OpenFeign 微服务调用注意事项

在微服务架构中&#xff0c;OpenFeign 是一种常用的 HTTP 客户端工具&#xff0c;用于实现服务之间的调用。它提供了声明式的接口调用方式&#xff0c;大幅简化了开发工作。然而&#xff0c;在实际使用中&#xff0c;需要注意一些细节&#xff0c;尤其是在处理 GET、POST 请求和…