C++指针使用指南
指针
适合指针的情况
- 动态内存管理
C 语言中,malloc、calloc 和 free 等函数用于动态分配和释放内存,这些函数返回的都是指针类型。通过指针,可以动态创建和管理内存区域,尤其在需要动态数组或复杂数据结构(如链表、树和图)时非常有用。
int *arr = (int *)malloc(10 * sizeof(int)); // 动态分配一个整数数组
- 数组和字符串的操作
在 C 语言中,数组名本质上是指向第一个元素的指针。可以通过指针来访问数组元素,同时也可以遍历字符串(字符数组)进行字符处理。
例如,在字符串操作时,指针可以用于逐字符遍历和修改,特别是在处理输入、输出和字符串函数时。
char str[] = "Hello";
char *p = str;
while (*p != '\0')
{ printf("%c", *p);p++;
}
- 函数参数传递
C 语言中,默认情况下,函数参数是按值传递的,也就是说函数内对参数的修改不会影响原始值。通过指针传递,可以直接修改传入的变量值。
例如,通过指针可以实现对数组的修改、对复杂结构(如链表)的操作,也可以通过指针传递返回多个值。
void updateValue(int *p) {*p = 10; // 修改原始变量的值}
- 结构体与复杂数据结构
在链表、树、图等数据结构中,指针是基本操作的核心。例如,链表节点中存储了指向下一个节点的指针。指针使得这些数据结构可以灵活地动态扩展和收缩。
结构体指针还用于传递较大结构体以减少内存复制开销。
struct Node {int data; struct Node *next; // 指向下一个节点的指针};
- 指针数组和多级指针
指针数组(如 char *argv[])用于存储多个字符串或数组。多级指针(如 char **argv)则可以表示指针的指针,即指向另一个指针的地址。
在处理二维数组或传递数组的指针时,多级指针非常常用。
nt *matrix[3]; // 指针数组
int **p; // 指针的指针
- 函数指针
函数指针允许在运行时动态调用函数,这对于实现回调函数、函数数组、或类似面向对象的设计(如虚函数)非常有用。
函数指针广泛用于事件处理、库函数和系统编程中,尤其是在处理带有回调机制的程序。
void (*func_ptr)(int) = someFunction;
func_ptr(5); // 调用指向的函数
- 文件操作
文件操作中,FILE * 是一个指向文件结构体的指针,用于操作文件。例如,fopen 函数返回一个 FILE * 类型指针,通过该指针可以读取、写入和关闭文件。
FILE *fp = fopen("file.txt", "r");
- 低级系统编程和硬件访问
指针常用于直接访问硬件资源或进行系统编程,例如在操作系统内核中指向内存地址或寄存器地址。在嵌入式系统中,指针常用于访问特定硬件地址,控制 I/O 操作。
不适用指针的情况
- 局部变量或简单的数据传递
当函数仅需要传递和操作小的、简单的局部变量(如 int、float)时,直接按值传递即可。按值传递能避免指针带来的复杂性,也不用担心指针的指向问题或内存管理。
void printValue(int x) { printf("Value is: %d\n", x);
}
在这种情况下,不需要通过指针来传递 int 类型的值,因为按值传递更简单,也不会有数据修改的风险。
- 无需修改的数组或字符串
如果函数只需要读取数组或字符串内容,而不对其进行修改,则不需要使用指针传递,直接传递数组名(即指针)或常量字符串会更加安全。
void printString(const char str[]) {
printf(“String: %s\n”, str);
}
这里的 str 是一个只读字符串数组,不需要使用指针修改其内容,且定义为 const 表示该数组不可修改。
- 不涉及动态内存管理
对于静态分配的内存(如静态数组或全局变量)或在编译时确定大小的数组,通常不需要指针。静态内存分配由编译器管理,不涉及动态内存操作,不会出现内存泄漏等问题。
int arr[10] = {0}; // 静态数组
- 简单的数学运算和逻辑操作
在涉及简单的数学计算和逻辑判断时,不需要使用指针来操作变量。指针会增加不必要的复杂性,并可能带来意想不到的错误。
int add(int a, int b) { return a + b;
}
- 结构简单、不需要传递大块数据的场景
在许多情况下,按值传递比指针传递更适合于简单结构,尤其是在传递小型结构体时。对于小型结构体的按值传递性能影响较小,代码更易读且安全。
struct Point {int x, y;
};struct Point movePoint(struct Point p) {p.x += 1;p.y += 1; return p;
}
-
不需要返回多个值
如果函数不需要返回多个值,按值传递可以满足需求,避免使用指针。例如,如果只返回一个值,可以使用函数的返回值,而不必用指针参数返回额外的结果。 -
避免复杂指针运算的场景
在代码需要频繁使用多级指针(如指向指针的指针)或复杂的指针算术时,通常更容易出现内存错误或空指针问题。在这种情况下,尽量简化代码,避免不必要的指针运算。
相关文章:
C++指针使用指南
指针 适合指针的情况 动态内存管理 C 语言中,malloc、calloc 和 free 等函数用于动态分配和释放内存,这些函数返回的都是指针类型。通过指针,可以动态创建和管理内存区域,尤其在需要动态数组或复杂数据结构(如链表、…...
一文学会,利用LLaMA 3.2打造能“识图断字”的个人AI助理
人工智能最直接也是最普及的应用之一肯定是聊天机器人,或者叫个人 AI 助理。尽管聊天机器人以各种形式存在了30年,但在过去两年中,这些个人AI助理才真正成为热门应用。它们已经从前沿技术范畴落地到生活的各个方面、社交场合和商业场景中。 虽…...
idea的mapper.xml文件里写sql语句出现Tag name expected错误提示
原因如下: xml文件的某些特殊字符是自动转义的, xml解析器会忽视CDATA中的内容 解决方法: 使用下面的表达式表示对应符号。 小于(<):<大于(>):>和号(&):&单引号():'双引…...
EasyExcel 使用多线程按顺序导出数据
通过多线程读取数据,使用EasyExcel按顺序导出数据 导出时如果要保证顺序需要使用单线程,但是查询时可以用多线程,因为多线程查询后返回数据不是按照顺序排列的,所以我的思路是再循环时给每个线程打标识,通过标识来排序…...
数据驱动的投资分析:民锋科技的量化模型探索
在全球金融市场中,数据驱动的投资分析正在变革传统投资方式。民锋科技通过精密的量化模型和智能算法,为投资者提供更加科学的市场预测和投资分析工具,以帮助他们更好地理解市场波动、优化投资组合,实现风险管理。 #### 一、数据驱…...
cesium 设置相机视角 flyTo 参数destination,orientation
效果 // 监听相机的改变 用来设置相机飞行到哪里window.viewer.camera.changed.addEventListener(function () {// 当相机改变时,获取相机的参数let camera window.viewer.camera;// 获取当前摄像机的位置(经纬度)let cameraPosition wind…...
vue+Leaflet.PM插件实现创建和编辑几何图形(点、线、面、圆等)
场景 VueLeaflet实现加载OSM显示地图:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/122317394在上面加载显示OSM的基础上,使用Leaflet.pm插件实现在页面上绘制、编辑、剪切、移动几何元素。Leaflet.pm插件 用于创建和编辑几何图层的插件可…...
Rust语言在系统编程中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 引言 Rust 概述 定义与原理 发展历程 Ru…...
test 是 JavaScript 中正则表达式对象 (RegExp) 的一种方法,用于测试一个字符串是否匹配某个正则表达式
在你的代码中,test 方法用于验证扫描结果是否符合特定的格式要求。具体来说,/^[A-Za-z\d]{16}$/.test(res.result) 这一行代码用于检查扫描结果 res.result 是否是一个由16个字母或数字组成的字符串。 test 方法的作用 正则表达式匹配: ^ 表…...
大厂社招3年-力扣热点高频刷题记录(已更新100+道热点题)
前言: 最近从大厂出来看机会,大厂面试基本都考察算法,于是维护此文档,一是查缺补漏,确保整体热点算法题目的应知应会,与思路的灵活理解;二是分享出来给其他同学朋友做一个参考借鉴,共…...
6.2 对角化矩阵(2)
五、不能对角化的矩阵 假设 λ \lambda λ 是 A A A 的一个特征值,我们从两个方面发现这个事实: 特征向量(几何的): A x λ x A\boldsymbol x\lambda\boldsymbol x Axλx 有非零解。特征值(代数的&…...
ubuntu24.04播放语音视频
直接打开ubuntu自带的video播放.mp4文件,弹窗报错如下: 播放此影片需要插件 MPEG-4 AAC 编码器安装方式: sudo apt install gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly sudo apt install ffmpeg验证AA…...
GPT4的下一代Orion已经降速了?
嘿,大家好,我是小索奇!说起AI,相信不少人都和我一样,总感觉这玩意儿发展得就像装了火箭,快得让人眼花缭乱。咱们从GPT-3到GPT-4,一路哇哦着过来,天天惊叹它越来越聪明,越…...
SpringCloud框架学习(第二部分:Consul、LoadBalancer和openFeign)
目录 六、Consul服务注册和发现 1.基本介绍 2.下载运行 3.服务注册与发现 (1)支付服务provider8001注册进consul (2)修改订单服务cloud-consumer-order80 4.CAP (1)CAP理论 (2&#x…...
Linux 批量配置互信
批量配置SSH互信脚本 #!/bin/bash# 定义目标机器列表 machines( "192.168.122.87" "192.168.122.89" "192.168.122.90" ) set -o errexit # 设置默认的用户名和密码 default_username"root" default_password"111111"# 读取…...
设计定长的内存池
目录 定长内存池设计设计思路具体实现定长内存池初始化T*New()申请内存代码 void Delete(T* obj)回收内存代码 设计的总代码测试代码 Objectpool.h文件代码test.cpp文件代码拓展windows和Linux下如何直接向堆申请页为单位的大块内存: 感谢各位大佬对我的支持,如果我…...
【动手学电机驱动】 STM32-FOC(7)基于 MCSDK6.0 控制与调试速度环
STM32-FOC(1)STM32 电机控制的软件开发环境 STM32-FOC(2)STM32 导入和创建项目 STM32-FOC(3)STM32 三路互补 PWM 输出 STM32-FOC(4)IHM03 电机控制套件介绍 STM32-FOC(5&…...
无人机飞手考证,地面站培训技术详解
无人机飞手考证及地面站培训技术涉及多个关键方面,以下是对这些方面的详细解析: 一、无人机飞手考证流程与要求 1. 证书类型 民用无人机驾驶员证书:这是国家民航局颁发的无人机操作人员资质证书,分为视距内驾驶员、超视距驾驶员…...
音视频入门基础:MPEG2-TS专题(3)——TS Header简介
注:本文有部分内容引用了维基百科:https://zh.wikipedia.org/wiki/MPEG2-TS 一、引言 本文对MPEG2-TS格式的TS Header进行简介。 进行简介之前,请各位先下载MPEG2-TS的官方文档。ITU-T和ISO/IEC都分别提供MPEG2-TS的官方文档。但是ITU提供的…...
Sam Altman:年底将有重磅更新,但不是GPT-5!
大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,专注于分享AI全维度知识,包括但不限于AI科普,AI工…...
2026数字营销专业学数据分析的职业优势
一、数字营销与数据分析的融合趋势2026年数字营销领域将进一步依赖数据驱动决策。随着消费者行为数字化程度加深,企业需通过数据分析实现个性化营销、动态定价和实时优化。复合型人才需同时掌握营销策略与数据建模能力,以应对跨渠道归因、隐私安全等复杂…...
STM32H743音频实战:用CubeMX和I2S驱动WM8978,从寄存器配置到代码移植避坑
STM32H743音频实战:CubeMX与I2S驱动WM8978的深度避坑指南 第一次在STM32H743上调试WM8978音频编解码器时,我盯着示波器上杂乱无章的I2S信号波形发呆了半小时。耳机里偶尔传来的爆裂声仿佛在嘲笑我的无知——这场景想必很多嵌入式音频开发者都不陌生。本文…...
SD-PPP:如何在5分钟内为Photoshop安装免费AI插件并掌握专业绘图工作流
SD-PPP:如何在5分钟内为Photoshop安装免费AI插件并掌握专业绘图工作流 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp SD-PPP是一款免费开源的Photoshop AI插件,将先进的AI绘图能力直接集成…...
5G FWA智能终端技术解析:从核心架构到运营商集采实战
1. 项目概述:一次典型的5G FWA终端集采中标事件最近,业内传来一个挺有意思的消息,美格智能的5G FWA智能终端产品,在中国联通的一个招标项目中成功中标了。对于不熟悉通信行业的朋友来说,这听起来可能就是个普通的商业新…...
Agent怎样做到在信创环境全栈兼容?2026企业级智能体信创适配技术全解析
进入2026年,随着信创(信息技术应用创新)产业进入深水区,企业数字化转型已不再仅仅是简单的“去IOE”或系统迁移,而是演变为以AI Agent(智能体)为核心的新型生产力重构。在这一背景下,…...
Linux服务器TCP连接数远超65535:从协议原理到高并发调优
1. 项目概述:一个流传甚广的“常识”误区“Linux服务器的TCP连接数上限是65535。” 这句话,我相信很多运维工程师、后端开发,甚至是一些面试官都曾说过或听过。它像一条技术领域的“都市传说”,在无数技术讨论、博客文章甚至面试题…...
TsubakiTranslator:如何用免费工具打破Galgame语言壁垒的终极指南
TsubakiTranslator:如何用免费工具打破Galgame语言壁垒的终极指南 【免费下载链接】TsubakiTranslator 一款Galgame文本翻译工具,支持Textractor/剪切板/OCR翻译 项目地址: https://gitcode.com/gh_mirrors/ts/TsubakiTranslator 还在为看不懂日语…...
c#string字符串
//API 应用程序接口 内置函数 //字符串的属性 string a "abcd";//表示字符串中 字符的个数Console.WriteLine(a.Length);//字符串是可以通过 索引 取值的 因为string类内部顶一个一个索引器char c a[2];Console.WriteLine(c);string s1 "abc";st…...
MobileSAM深度解析:轻量化图像分割架构揭秘与实战应用
MobileSAM深度解析:轻量化图像分割架构揭秘与实战应用 【免费下载链接】MobileSAM This is the official code for MobileSAM project that makes SAM lightweight for mobile applications and beyond! 项目地址: https://gitcode.com/gh_mirrors/mo/MobileSAM …...
FactoryBluePrints项目深度解析:戴森球计划终极工厂蓝图优化指南
FactoryBluePrints项目深度解析:戴森球计划终极工厂蓝图优化指南 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints项目是戴森球计划游戏中最为…...
