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工…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
