C++中指针的使用方法

基本概念

  • 指针:一个变量,它存储另一个变量的内存地址。
  • 地址运算符 &:用于获取变量的内存地址。
  • 间接运算符 *:用于访问指针所指向的变量的值。

声明和初始化

int a = 10;      // 定义一个整数变量
int *p = &a;     // 定义一个指向整数的指针,并将其初始化为a的地址

操作指针

获取变量地址
int a = 10;
int *p = &a;    // 获取变量a的地址,并赋值给指针p

访问指针指向的值

int a = 10;
int *p = &a;
std::cout << *p << std::endl;  // 输出10

修改指针指向的值

int a = 10;
int *p = &a;
*p = 20;        // 修改指针p指向的变量a的值
std::cout << a << std::endl;  // 输出20

常见用法

动态内存分配

使用newdelete关键字进行动态内存分配和释放:

int *p = new int;    // 动态分配一个整数
*p = 10;             // 给分配的内存赋值
std::cout << *p << std::endl;  // 输出10
delete p;            // 释放分配的内存

分配数组并释放:

int *arr = new int[5];  // 动态分配一个整数数组
for (int i = 0; i < 5; ++i) {arr[i] = i;         // 给数组赋值
}
for (int i = 0; i < 5; ++i) {std::cout << arr[i] << " ";  // 输出数组内容
}
delete[] arr;           // 释放数组内存
指针数组和指向数组的指针

指针数组:

int a = 10, b = 20, c = 30;
int *arr[3] = {&a, &b, &c};  // 定义一个指针数组
std::cout << *arr[0] << " " << *arr[1] << " " << *arr[2] << std::endl;  // 输出10 20 30

指向数组的指针:

int arr[3] = {10, 20, 30};
int (*p)[3] = &arr;  // 定义一个指向数组的指针
std::cout << (*p)[0] << " " << (*p)[1] << " " << (*p)[2] << std::endl;  // 输出10 20 30
指针函数和函数指针

指针函数:返回指针的函数

int* func() {int *p = new int(10);  // 动态分配一个整数并初始化为10return p;
}
int *p = func();
std::cout << *p << std::endl;  // 输出10
delete p;

函数指针:指向函数的指针。

int add(int a, int b) {return a + b;
}
int (*p)(int, int) = add;  // 定义一个指向函数add的指针
std::cout << p(2, 3) << std::endl;  // 输出5

代码示例

以下是一个更完整的例子,展示了指针的各种用法

#include <iostream>int main() {// 声明和初始化指针int a = 10;int *p = &a;std::cout << "Value of a: " << a << std::endl;    // 输出a的值std::cout << "Address of a: " << &a << std::endl; // 输出a的地址std::cout << "Pointer p points to: " << p << std::endl; // 输出指针p的值(即a的地址)std::cout << "Value pointed to by p: " << *p << std::endl; // 输出指针p指向的值// 修改指针指向的值*p = 20;std::cout << "New value of a: " << a << std::endl; // 输出a的新值// 动态内存分配和释放int *dynamicInt = new int(30);std::cout << "Dynamically allocated integer: " << *dynamicInt << std::endl;delete dynamicInt;// 动态数组分配和释放int *dynamicArray = new int[5];for (int i = 0; i < 5; ++i) {dynamicArray[i] = i * 10;}for (int i = 0; i < 5; ++i) {std::cout << "dynamicArray[" << i << "]: " << dynamicArray[i] << std::endl;}delete[] dynamicArray;// 指针数组int x = 1, y = 2, z = 3;int *ptrArray[3] = {&x, &y, &z};for (int i = 0; i < 3; ++i) {std::cout << "Value pointed to by ptrArray[" << i << "]: " << *ptrArray[i] << std::endl;}// 指向数组的指针int arr[3] = {100, 200, 300};int (*arrPtr)[3] = &arr;std::cout << "Values in array through pointer: " << (*arrPtr)[0] << ", " << (*arrPtr)[1] << ", " << (*arrPtr)[2] << std::endl;// 函数指针int (*funcPtr)(int, int) = [](int a, int b) -> int { return a + b; };std::cout << "Sum using function pointer: " << funcPtr(5, 7) << std::endl;return 0;
}

结论

通过上述示例,可以看到指针在C++中是如何声明、初始化和操作的。指针的灵活性使其在动态内存分配、数组处理、指针数组、指向数组的指针以及函数指针等方面得到了广泛应用。在使用指针时,需要特别注意内存管理和避免悬空指针的出现,以保证程序的稳定性和安全性。

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

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

相关文章

算法导论 总结索引 | 第四部分 第十六章:贪心算法

1、求解最优化问题的算法 通常需要经过一系列的步骤&#xff0c;在每个步骤都面临多种选择。对于许多最优化问题&#xff0c;使用动态规划算法求最优解有些杀鸡用牛刀了&#xff0c;可以使用更简单、更高效的算法 贪心算法&#xff08;greedy algorithm&#xff09;就是这样的算…

Git 学习笔记(超详细注释,从0到1)

Git学习笔记 1.1 关键词 Fork、pull requests、pull、fetch、push、diff、merge、commit、add、checkout 1.2 原理&#xff08;看图学习&#xff09; 1.3 Fork别人仓库到自己仓库中 记住2个地址 1&#xff09;上游地址&#xff08;upstream地址&#xff09;&#xff1a;http…

Nuxt 应用的三种运行模式(五)

Nuxt.js 提供了三种运行模式&#xff0c;分别是&#xff1a; SPA&#xff08;单页面应用&#xff09; Universal&#xff08;服务端渲染&#xff09; Static&#xff08;静态生成&#xff09; 每种模式都适用于不同的场景和需求&#xff0c;下面将详细解析这三种模式的区别&…

【Qt】Qt多线程编程指南:提升应用性能与用户体验

文章目录 前言1. Qt 多线程概述2. QThread 常用 API3. 使用线程4. 多线的使用场景5. 线程安全问题5.1. 加锁5.2. QReadWriteLocker、QReadLocker、QWriteLocker 6. 条件变量 与 信号量6.1. 条件变量6.2 信号量 总结 前言 在现代软件开发中&#xff0c;多线程编程已成为一个不可…

C语言类型转换理解不同的基本类型为什么能够进行运算

类型转换 1.类型转换1.1隐式转换1.2常用算术转换1.2强制类型转换 1.类型转换 在执行算数运算时&#xff0c;计算机比C语言的限制更多。为了让计算机执行算术运算&#xff0c;通常要求操作数用相同的大小&#xff08;即为的数量相同&#xff09;&#xff0c;但是C语言却允许混合…

Java基础:常用类(四)

Java基础&#xff1a;常用类&#xff08;四&#xff09; 文章目录 Java基础&#xff1a;常用类&#xff08;四&#xff09;1. String字符串类1.1 简介1.2 创建方式1.3 构造方法1.4 连接操作符1.5 常用方法 2. StringBuffer和StringBuilder类2.1 StringBuffer类2.1.1 简介2.1.2 …

智能电能表如何助力智慧农业

智能电能表作为智能电网数据采集的基本设备之一&#xff0c;不仅具备传统电能表基本用电量的计量功能&#xff0c;还具备双向多种费率计量功能、用户端控制功能、多种数据传输模式的双向数据通信功能以及防窃电功能等智能化的功能。这些功能使得智能电能表在农业领域的应用具有…

基于深度学习的图像去雾

基于深度学习的图像去雾 图像去雾是指从有雾的图像中恢复清晰图像的过程。传统的图像去雾方法&#xff08;如暗原色先验、图像分层法等&#xff09;在某些情况下表现良好&#xff0c;但在复杂场景下效果有限。深度学习方法利用大量的数据和强大的模型能力&#xff0c;在图像去…

【渗透测试】小程序反编译

前言 在渗透测试时&#xff0c;除了常规的Web渗透&#xff0c;小程序也是我们需要重点关注的地方&#xff0c;微信小程序反编译后&#xff0c;可以借助微信小程序开发者工具进行调试&#xff0c;搜索敏感关键字&#xff0c;或许能够发现泄露的AccessKey等敏感信息及数据 工具…

【PHP小课堂】PHP中PRGE正则函数的学习

PHP中PRGE正则函数的学习 正则表达式的作用想必不用我多说了&#xff0c;大家在日常的开发中或多或少都会接触到。特别是对于一些登录&#xff08;邮箱、手机号&#xff09;以及网页爬虫来说&#xff0c;正则表达式就是神器一般的存在。在 PHP 中&#xff0c;有两种处理正则表达…

ChatGPT在用户交互过程中如何实现自我学习和优化?

ChatGPT的自我学习和优化&#xff1a;深度解析与未来展望 在人工智能领域&#xff0c;ChatGPT的出现标志着自然语言处理技术的一大飞跃。作为一个先进的语言模型&#xff0c;ChatGPT不仅能够与用户进行流畅的对话&#xff0c;还能够通过自我学习和优化来不断提升其性能。本文将…

【SkiaSharp绘图11】SKCanvas属性详解

文章目录 SKCanvas构造SKCanvas构造光栅 Surface构造GPU Surface构造PDF文档构造XPS文档构造SVG文档SKNoDrawCanvas 变换剪裁和状态构造函数相关属性DeviceClipBounds获取裁切边界(设备坐标系)ClipRect修改裁切区域IsClipEmpty当前裁切区域是否为空IsClipRect裁切区域是否为矩形…

JFreeChart 生成Word图表

文章目录 1 思路1.1 概述1.2 支持的图表类型1.3 特性 2 准备模板3 导入依赖4 图表生成工具类 ChartWithChineseExample步骤 1: 准备字体文件步骤 2: 注册字体到FontFactory步骤 3: 设置图表具体位置的字体柱状图&#xff1a;饼图&#xff1a;折线图&#xff1a;完整代码&#x…

【QT】Svg图标

目录 SVGQT绘制SVG流程 SVG 一般而言&#xff0c;QSS是无法直接使用svg图像的。 那如何才能显示svg呢&#xff1f;我们知道svg的好处有很多&#xff0c;如矢量图&#xff0c;体积小等等 svg本来就是一个document&#xff08;可参考12&#xff09;&#xff0c;QT提供了QSvgRend…

二叉树深度优先搜索(非递归实现,迭代法)

目录 为什么可以用迭代法实现二叉树的前后中序遍历&#xff1f; 前序遍历 后序遍历 中序遍历 为什么可以用迭代法实现二叉树的前后中序遍历&#xff1f; 因为递归的实现本质是&#xff0c;每次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中&#xff0c;然…

web期末作业设计网页

设计一个网页作为期末作业是一个很好的机会来展示你的前端开发技能。以下是一些步骤和建议&#xff0c;帮助你完成这个项目&#xff1a; 1. 确定网页主题和目的 决定你的网页是关于什么的&#xff08;例如&#xff1a;个人博客、在线商店、公司网站、信息发布平台等&#xff…

国产车规MCU OTA方案总结

目录 1. 旗芯微FC4150 OTA 2. 云途YTM32B1MD OTA 3.小结 今天没有废话&#xff0c;啪一下很快&#xff0c;把目前接触到的国内带eFlash的车规MCU硬件OTA方案做一个梳理。 1. 旗芯微FC4150 OTA 旗芯微FC4150是基于ARM Cortex(快去审核下官网介绍&#xff0c;少了个T)-M4F内…

入门者必看-Ansible:自动化运维的利器

1. 引言 在当今快速变化的IT环境中&#xff0c;自动化成为了提升工作效率和确保系统一致性的重要手段。Ansible作为一个开源的自动化工具&#xff0c;因其简单易用、功能强大而广受欢迎。本文将深入探讨Ansible的概念、架构、体系结构、搭建过程、常用操作方式以及使用场景&…

openGauss Developer Day 2024丨MogDB实现数据库技术跨越,Ustore引擎革新存储新境界

openGauss Developer Day 2024 6月21日&#xff0c;openGauss Developer Day 2024在北京昆泰嘉瑞文化中心成功召开。大会聚集学术专家、行业用户、合作伙伴和开发者&#xff0c;共同探讨数据库面向多场景的技术创新&#xff0c;分享基于 openGauss 的行业联合创新成果及实践案例…

探索PHP中的魔术常量

PHP中的魔术常量&#xff08;Magic Constants&#xff09;是一些特殊的预定义常量&#xff0c;它们在不同的上下文中具有不同的值。这些常量可以帮助开发者获取文件路径、行号、函数名等信息&#xff0c;从而方便调试和日志记录。本文将详细介绍PHP中的魔术常量&#xff0c;帮助…