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工…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...
CMS内容管理系统的设计与实现:多站点模式的实现
在一套内容管理系统中,其实有很多站点,比如企业门户网站,产品手册,知识帮助手册等,因此会需要多个站点,甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...
【QT控件】显示类控件
目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏:QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…...
