C++ 指针介绍

指针是C++编程语言中的一个强大且重要的特性。它允许程序员直接操作内存地址,从而提供了对低级别内存的访问和控制。虽然指针在使用时可能比较复杂且容易出错,但它们在提高程序效率和灵活性方面有着不可替代的作用。本文将介绍C++指针的基本概念、用法及其应用场景。

一、指针的基本概念

1.1 什么是指针?

指针是一个变量,其值为另一个变量的内存地址。通过指针,可以访问和修改该地址指向的内存中的值。

int main() {int a = 10;int* p = &a;  // p是指向a的指针,存储a的内存地址std::cout << "a: " << a << std::endl;std::cout << "Address of a: " << &a << std::endl;std::cout << "p: " << p << std::endl;std::cout << "Value at p: " << *p << std::endl;  // 使用*操作符访问指针p指向的值return 0;
}

1.2 指针的声明和初始化

  • 声明指针:在变量类型后面加上*表示声明一个指针变量。
  • 初始化指针:使用取地址符号&来获取变量的内存地址,并赋值给指针。
int* p;  // 声明一个指向int类型的指针p
int a = 10;
p = &a;  // 将a的地址赋值给指针p

1.3 指针的解引用

解引用(dereference)是通过指针访问其指向的内存地址中的值。使用解引用操作符*可以实现解引用。

int a = 10;
int* p = &a;
int value = *p;  // 通过解引用操作符*获取指针p指向的值

二、指针的常见用法

2.1 指针和数组

在C++中,数组名实际上是一个指向数组第一个元素的指针。因此,指针可以用于遍历和操作数组。

int arr[] = {1, 2, 3, 4, 5};
int* p = arr;  // 数组名arr是一个指向数组第一个元素的指针for (int i = 0; i < 5; i++) {std::cout << *(p + i) << " ";  // 使用指针遍历数组
}

2.2 指针和函数

指针可以作为函数参数,用于传递数组或实现指针引用调用。指针参数使得函数可以直接操作传入的变量,而不是其副本。

void increment(int* p) {(*p)++;  // 解引用指针,并对其指向的值进行操作
}int main() {int a = 10;increment(&a);  // 传递变量a的地址std::cout << "a: " << a << std::endl;  // 输出结果为11return 0;
}

2.3 指针和动态内存分配

在C++中,可以使用指针和动态内存分配函数(如newdelete)来管理动态内存。动态内存分配允许在运行时分配和释放内存。

int* p = new int;  // 动态分配一个int类型的内存空间
*p = 10;  // 赋值
std::cout << "Value at p: " << *p << std::endl;
delete p;  // 释放动态分配的内存

对于数组的动态分配和释放:

int* arr = new int[5];  // 动态分配一个包含5个int类型元素的数组
for (int i = 0; i < 5; i++) {arr[i] = i + 1;
}
delete[] arr;  // 释放动态分配的数组内存

三、指针的高级用法

3.1 指向指针的指针

C++允许指针指向另一个指针,这称为指向指针的指针(pointer to pointer)。

int a = 10;
int* p = &a;
int** pp = &p;  // pp是一个指向指针p的指针std::cout << "Value at pp: " << **pp << std::endl;  // 通过两次解引用访问a的值

3.2 指针数组和数组指针

  • 指针数组:数组的每个元素都是一个指针。
int* arr[3];
int a = 1, b = 2, c = 3;
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;for (int i = 0; i < 3; i++) {std::cout << *arr[i] << " ";
}
  • 数组指针:指向数组的指针。
int arr[3] = {1, 2, 3};
int (*p)[3] = &arr;for (int i = 0; i < 3; i++) {std::cout << (*p)[i] << " ";
}

四、指针的注意事项

  1. 指针初始化:声明指针时应尽量初始化,避免使用未初始化的指针。
  2. 指针运算:指针运算需要小心,避免访问越界内存。
  3. 内存管理:使用动态内存分配时,应确保在使用new分配内存后使用delete释放内存,避免内存泄漏。
  4. 空指针检查:在使用指针前,应检查指针是否为空,以避免访问空指针引发错误。
int* p = nullptr;
if (p != nullptr) {// 安全使用指针p
}

五、总结

指针是C++中的重要概念,提供了对内存的直接操作能力。通过指针,可以实现高效的数组操作、动态内存分配和函数参数传递。尽管指针使用起来可能比较复杂且容易出错,但掌握指针的使用对于编写高效和灵活的C++代码是必不可少的。

希望本文对您理解和使用C++指针有所帮助。如果您有任何疑问或建议,欢迎留言讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/38834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker 中 MySQL 迁移策略(单节点)

目录 一、 简介二、操作流程2.1 进入mysql容器2.2 导出 MySQL 数据2.3. 将导出的文件复制到宿主机2.4 创建 Docker Compose 配置2.5 启动新的 Docker 容器2.6 导入数据到新的容器2.7 验证数据2.8 删除旧的容器&#xff08;删除操作需慎重&#xff09; 三、推荐配置四、写在后面…

当年很多跑到美加澳写代码的人现在又移回香港?什么原因?

当年很多跑到美加澳写代码的人现在又移回香港&#xff1f;什么原因&#xff1f; 近年来&#xff0c;确实有部分曾经移民到美国、加拿大、澳大利亚等地的香港居民选择移回香港。这一现象与多种因素相关&#xff0c;主要可以归结为以下几点&#xff1a; 疫情后的环境变化&#…

【STM32】温湿度采集与OLED显示

一、任务要求 1. 学习I2C总线通信协议&#xff0c;使用STM32F103完成基于I2C协议的AHT20温湿度传感器的数据采集&#xff0c;并将采集的温度-湿度值通过串口输出。 任务要求&#xff1a; 1&#xff09;解释什么是“软件I2C”和“硬件I2C”&#xff1f;&#xff08;阅读野火配…

2025第13届常州国际工业装备博览会招商全面启动

常州智造 装备中国|2025第13届常州国际工业装备博览会招商全面启动 2025第13届常州国际工业装备博览会将于2025年4月11-13日在常州西太湖国际博览中心盛大举行&#xff01;目前&#xff0c;各项筹备工作正稳步推进。 60000平米的超大规模、800多家国内外工业装备制造名企将云集…

C++中的RAII(资源获取即初始化)原则

C中的RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;资源获取即初始化&#xff09;原则是一种管理资源、避免资源泄漏的惯用法。RAII是C之父Bjarne Stroustrup提出的设计理念&#xff0c;其核心思想是将资源的获取&#xff08;如动态内存分配、文件句柄、…

最细最有条理解析:事件循环(消息循环)是什么?进程与线程的定义、关系与差异

目录 事件循环&#xff1a;引入 一、浏览器的进程模型 1.1、什么是进程&#xff08;Process&#xff09; 1.2、什么是线程&#xff08;Thread&#xff09; 1.3、进程与线程之间的关系联系与区别 二、浏览器有哪些进程和线程 2.1、浏览器的主要进程 ①浏览器进程 ②网络…

ctfshow sqli-libs web561--web568

web561 ?id-1 or 1--?id-1 union select 1,2,3--?id-1 union select 1,(select group_concat(column_name) from information_schema.columns where table_nameflags),3-- Your Username is : id,flag4s?id-1 union select 1,(select group_concat(flag4s) from ctfshow.f…

扩展学习|风险评估和风险管理:回顾其基础上的最新进展

文献来源&#xff1a;[1]Aven, T. (2016). Risk assessment and risk management: Review of recent advances on their foundation. European journal of operational research, 253(1), 1-13. 文章简介&#xff1a;大约30-40年前&#xff0c;风险评估和管理被确立为一个科学领…

数据结构 - C/C++ - 链表

目录 结构特性 内存布局 结构样式 结构拓展 单链表 结构定义 节点关联 插入节点 删除节点 常见操作 双链表 环链表 结构容器 结构设计 结构特性 线性结构的存储方式 顺序存储 - 数组 链式存储 - 链表 线性结构的链式存储是通过任意的存储单元来存储线性…

技术分享:分布式数据库DNS服务器的架构思路

DNS是企业数字化转型的基石。伴随微服务或单元化部署的推广&#xff0c;许多用户也开始采用分布式数据库将原来的单体数据库集群服务架构拆分为大量分布式子服务集群&#xff0c;对应不同的微服务或服务单元。本文将从分布式数据库DNS服务器的架构需求、架构分析两方面入手&…

1_插入排序_循环不变式

01_插入排序 #include<stdio.h>void insert_sort(int arr[], int n); void printArray(int arr[], size);int main() {int arr[] {1, 2, 3, 22, 5, 9};int n sizeof(arr) / sizeof(arr[0]);printf("打印原始数组:\n");prinfArray(arr, n);insert_sort(arr, …

湖北大学2024年成人高考函授报名专升本市场营销专业介绍

在璀璨的学术殿堂中&#xff0c;湖北大学如同一颗璀璨的明珠&#xff0c;熠熠生辉。为了满足广大社会人士对于继续深造、提升自我、实现职业梦想的渴望&#xff0c;湖北大学特别开设了成人高等继续教育项目&#xff0c;为广大有志之士敞开了一扇通往知识殿堂的大门。 而今&…

【FFmpeg】av_write_frame函数

目录 1.av_write_frame1.1 写入pkt&#xff08;write_packets_common&#xff09;1.1.1 检查pkt的信息&#xff08;check_packet&#xff09;1.1.2 准备输入的pkt&#xff08;prepare_input_packet&#xff09;1.1.3 检查码流&#xff08;check_bitstream&#xff09;1.1.4 写入…

【创建者模式-建造者模式】

概要 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 建造者模式包含以下角色 抽象建造者类&#xff08;Builder&#xff09;&#xff1a;这个接口规定要实现复杂对象的那些部分的创建&#xff0c;并不涉及具体的部件对象的创建。具体建…

什么是ISR?

ISR&#xff08;Interrupt Service Routine&#xff0c;中断服务程序&#xff09;是一个用于处理硬件中断的特定程序。中断是硬件或软件引起的事件&#xff0c;会暂时打断当前正在运行的任务&#xff0c;以便紧急处理某个事件。ISR的目的是快速响应中断信号&#xff0c;执行所需…

在WSL Ubuntu中启用root用户的SSH服务

在 Ubuntu 中&#xff0c;默认情况下 root 用户是禁用 SSH 登录的&#xff0c;这是为了增加系统安全性。 一、修改配置 找到 PermitRootLogin 行&#xff1a;在文件中找到 PermitRootLogin 配置项。默认情况下&#xff0c;它通常被设置为 PermitRootLogin prohibit-password 或…

一篇文章学会【node.js安装以及Vue-Cli脚手架搭建】

一.为什么搭建Vue-Cli (1).传统的前端项目结构&#xff1a; 一个项目中有许多html文件&#xff0c;每一个html文件都是相互独立的&#xff0c; 如果需要在页面中导入一些外部依赖的组件&#xff0c;就需要在每一个html文件中都需要导入&#xff0c;非常麻烦 (2).现在的前端…

A股低开高走,近3000点,行情要启动了吗?

A股低开高走&#xff0c;近3000点&#xff0c;行情要启动了吗&#xff1f; 今天的A股&#xff0c;让人瞪目结舌了&#xff0c;你们知道是为什么吗&#xff1f;盘面上出现2个重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市低开高走&#xff0c;银行板块护盘指数&…

Windows 下后台启动java项目的 jar 包

java -jar swagger.jar 的dos窗口 后台启动 jar 包&#xff1a; 使用 javaw.exe 启动 jar 包&#xff0c;并不会在窗口打印日志&#xff0c;而且会直接在后台运行进程&#xff0c;关掉窗口&#xff0c;进程继续跑 javaw -jar swagger.jar 关闭进程&#xff1a; 后台启动的 …

大数据面试题之Spark(7)

Spark实现wordcount Spark Streaming怎么实现数据持久化保存? Spark SQL读取文件&#xff0c;内存不够使用&#xff0c;如何处理? Spark的lazy体现在哪里? Spark中的并行度等于什么 Spark运行时并行度的设署 Spark SQL的数据倾斜 Spark的exactly-once Spark的RDD和p…