C/C++ 指针与内存操作详解——从一级指针到字符串转换函数的完整解析

C/C++ 指针与内存操作详解——从一级指针到字符串转换函数的完整解析

本文将带你系统理解 一级指针与二级指针的区别数组拷贝的注意事项字符串转整数函数实现 等 C/C++ 编程中常见且易混淆的知识点,并配合详细代码示例与常见坑点分析,让你从入门到掌握。


一级指针与二级指针的讲解

在 C/C++ 中,指针不仅能指向数据,还能指向另一个指针。这就产生了一级指针与二级指针的区别。

  • 一级指针
    例如 char* pt,它本身存储的是一个内存地址,该地址指向具体数据值。
    举例:

    char ch = 'A';
    char* pt = &ch; // pt 存放的是 ch 的地址
    
  • 二级指针
    例如 char** pt,它存储的地址指向的是另一个指针变量,而不是直接指向数据。
    举例:

    char ch = 'A';
    char* p1 = &ch; // p1 是一级指针
    char** p2 = &p1; // p2 是二级指针,指向 p1
    

示例:指向字符串数组的二级指针

假设有一个字符串数组:

char* STR[] = {"ABCD", "EFGH", "IJKL"};
  • STR 存放的其实是多个字符串的首地址(每个元素是 char*)。
  • 若用指针指向它,应使用二级指针:
char** pt = STR; // pt 是二级指针,指向字符串数组

否则会出现类型不匹配的编译错误。

常见错误写法

char* pt = STR; // 错误!类型不匹配

因为 STR 的类型是 char**,直接赋给 char* 会丢失一层地址信息。


数组拷贝的注意事项

假设题目要求:从数组 X 拷贝 50 个字节到数组 Y

错误做法

Y = X; // 错误!数组名是地址常量,不能直接赋值

正确做法

使用 memcpy 按字节拷贝:

memcpy(Y, X, 50); // 从 X 复制 50 个字节到 Y

注意点

  1. memcpy 第三个参数是 字节数,不是元素个数。
  2. 如果数组类型是 int(每个元素占 4 字节),拷贝 50 字节意味着会拷贝 12 个多一点的 int 元素,不是整 50 个元素。
  3. 要明确题目要求的是 “字节” 还是 “元素”

字符串转整数函数实现

需求:实现 ascii_to_int,将数字字符串转换为整数。

函数原型

int ascii_to_int(const char* string);

实现思路

  1. 遍历字符串中的每个字符。

  2. 检查是否为数字字符('0' ~ '9')。

  3. 若是数字,按十进制累加计算:

    value=value×10+(当前字符−′0′) value = value \times 10 + (当前字符 - '0') value=value×10+(当前字符0)

  4. 若遇到非数字字符,立即返回 0。

代码示例

int ascii_to_int(const char* string) {int value = 0;for (int i = 0; string[i] != '\0'; i++) {if (string[i] < '0' || string[i] > '9') {return 0; // 遇到非数字字符}value = value * 10 + (string[i] - '0');}return value;
}

测试用例

#include <iostream>
using namespace std;int main() {cout << ascii_to_int("123") << endl;      // 输出 123cout << ascii_to_int("12a34") << endl;    // 输出 0
}

其他要点与常见误区

  • 指针类型必须匹配
    char*char** 不是同一种类型,不能随意赋值。

  • memcpy 是按字节拷贝
    不会考虑类型大小,要自己计算总字节数。

  • 题目细节决定实现方式
    要分清“字节”与“元素”的概念,尤其在涉及 sizeof 时避免出错。


总结

本文从指针基础到内存拷贝,再到字符串处理,串联了 C/C++ 中几个极易出错的知识点:

  1. 一级指针与二级指针的内存关系
  2. 字符串数组指针的正确定义
  3. 数组拷贝的正确方法与细节
  4. 字符串转整数的完整实现

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

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

相关文章

Java -- HashSet的全面说明-Map接口的常用方法-遍历方法

目录 1. HashSet的全面说明 2. Map接口实现类的特点 注意&#xff1a;讲的是JDK8的Map接口特点 3. Map接口的常用方法 4. Map遍历方法 1. HashSet的全面说明 1. HashSet实现了Set接口 2. HashSet实际上是HashMap 3. 可以存放null值&#xff0c;但是只能有一个null 4. H…

【python】类型注解

参考【为什么越来越多Python项目都在写类型注解&#xff1f;】 https://www.bilibili.com/video/BV1sW81zbEkD/?share_sourcecopy_web&vd_source9332b8fc5ea8d349a54c3989f6189fd3代码示例使用变量 : 类型名 来注解。""" python类型注解 """…

零基础入门PostgreSQL教学视频,持续更新

PostgreSQL数据库在国内的迅速发展&#xff0c;引起了很多数据库从业者的注意&#xff0c;不少人都想学习这个热门的技术&#xff0c;但是毕竟有PostgreSQL有自己的特点与优势&#xff0c;不同于Oracle、MySQL等数据库&#xff0c;想要快速入门PostgreSQL技术需要下一些功夫。一…

PageAdmin与WordPress哪个适合企业建站

对于企业建站需求&#xff0c;PageAdmin和WordPress各有特点&#xff0c;以下是综合对比分析&#xff1a; ‌功能与专业性‌ ‌PageAdmin‌&#xff1a;专为企业级网站设计&#xff0c;内置自定义字段、表单和多站点管理功能&#xff0c;适合需要高定制化的企业官网、政府或学校…

微服务单元测试组件

背景 微服务的调试&#xff0c;哪怕是简单问题&#xff0c;需要启动9个服务&#xff0c;ui/nginx 网关 应用 auth 基础数据服务 redis nacos 平台服务 &#xff0c;效率差得不行&#xff0c;准备开发一个支持微服务环境的单元测试组件&#xff0c; 组件解决3个问题&#xff1a…

从零到一的 Python CI/CD 实战指南:用 GitHub Actions 与 Jenkins 打造稳定、可持续交付的工程力

从零到一的 Python CI/CD 实战指南:用 GitHub Actions 与 Jenkins 打造稳定、可持续交付的工程力 当我们把第一行 Python 程序跑通时,成就感像破土的新芽;而当它在每次提交后自动被测试、打包、发布、上线,稳定服务成千上万的用户,那是“工程化”的成熟。本文带你从概念到…

如何在保持人设新鲜感的同时,强化受众记忆点?

保持人设新鲜感与强化受众记忆点&#xff0c;本质是 “动态创新” 与 “核心稳定” 的平衡艺术。既需通过有序变化避免受众审美疲劳&#xff0c;又需让核心特质在重复中加深烙印&#xff0c;关键在于建立 “锚点稳定、外延流动” 的内容体系。一、锚定 “核心记忆单元”&#x…

Ubuntu 22.04 离线环境下 Python 包与 FFmpeg 安装全攻略​

Ubuntu 22.04 离线环境下 Python 包与 FFmpeg 安装全攻略 在没有网络连接的 Ubuntu 22.04 环境中安装软件包常常会遇到各种依赖问题&#xff0c;尤其是 Python 库和 FFmpeg 这类依赖复杂的工具。 本文将详细介绍如何在离线环境中安装指定的 Python 包&#xff08;包括 OpenCV、…

ESP32 I2S音频总线学习笔记(六):DIY蓝牙音箱教程

往期相关文章&#xff1a; ESP32 I2S音频总线学习笔记&#xff08;一&#xff09;&#xff1a;初识I2S通信与配置基础 ESP32 I2S音频总线学习笔记&#xff08;二&#xff09;&#xff1a;I2S读取INMP441音频数据 ESP32 I2S音频总线学习笔记&#xff08;三&#xff09;&#…

springboot博客实战笔记02

一、评论功能&#xff1a; 注意要先登录之后才能进行评论&#xff0c;所有把评论加入到登录拦截器当中 Overridepublic void addInterceptors(InterceptorRegistry registry) {//拦截test接口&#xff0c;后续实际遇到需要拦截的接口时&#xff0c;在配置为真正的拦截接口regis…

ThinkPHP+Mysql 灵活用工小程序-技术深度解析与实践指南

一、模块设计分包商&#xff1a;税地注册公司&#xff0c;用于在当地申请有利的税收政策&#xff0c;是实际报税公司。 代理商&#xff1a;代理商可以邀请客户使用本平台&#xff0c;平台会给予代理商一定的服务费差价作为佣金。 客户&#xff1a;使用本平台进行工资发放的…

开源数据发现平台:Amundsen 第1部分:基础入门与本地环境设置

Amundsen 是一个数据发现和元数据引擎&#xff0c;旨在提高数据分析师、数据科学家和工程师与数据交互时的生产力。目前&#xff0c;它通过索引数据资源&#xff08;表格、仪表板、数据流等&#xff09;并基于使用模式&#xff08;例如&#xff0c;查询频率高的表格会优先于查询…

Linux编程--进程

1、基本概念&#xff1a;进程&#xff1a;是程序动态执行的过程&#xff0c;包括创建、调度、消亡程序&#xff1a;存放在外存中一段数据的集合虚拟地址&#xff1a;进程使用的逻辑地址&#xff0c;有操作系统管理&#xff0c;不直接对应物理内存物理地址&#xff1a;实际内存的…

【开源工具】基于硬件指纹的“一机一码”软件授权系统全实现(附完整源码)

🚨 紧急预警!你的软件正在被白嫖?这套Python软件加密授权方案让破解者当场崩溃 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。 🐋 希望大家多多支持…

机器学习算法篇(八)-------svm支持向量机

目录 ​​1. SVM 的核心原理&#xff08;必须掌握&#xff09;​​ ​​2. Python 中的实践重点​​ ​​(1) Scikit-learn 的 SVM 实现​​ ​​(2) 数据预处理​​ ​​(3) 模型评估与调优​​ ​​3. 学习侧重点优先级​​ ​​4. 经典案例实践方向​​ ​​5. 学习…

发票查验接口接收参数说明-PHP语言集成-财务管理

发票验真服务接口可实时联网核验发票真伪&#xff0c;查验一致时返回全票面信息。其支持核验增值税发票管理系统开具发票的真伪&#xff0c;且能进行发票批量查验&#xff0c;当日开具的发票当日即可查验。同时&#xff0c;结合发票识别接口可实现自动识别发票信息核验&#xf…

Uniapp物联网平台登录与温湿度监测系统

下面是一个完整的Uniapp物联网平台实现&#xff0c;包含登录功能和温湿度监测系统。这个解决方案采用现代化UI设计&#xff0c;模拟了物联网平台的核心功能。文章末尾提供源码下载。 系统功能说明 这个Uniapp物联网平台登录与温湿度监测系统包含以下核心功能&#xff1a; 1.…

【企业架构】TOGAF概念之四(终结)

导读&#xff1a;学习TOGAF&#xff08;The Open Group Architecture Framework&#xff0c;开放组架构框架&#xff09;相关概念的意义和价值&#xff0c;体现在它为企业架构&#xff08;Enterprise Architecture, EA&#xff09;实践提供了标准化方法论、跨领域协同框架、战略…

centos 怎么部署 vscode 网页版

安装编译工具 下载适用于 linux 版本的 rpm 格式文件 下載 Visual Studio Tools - 免費安裝 Windows、Mac、Linux 拷贝路径&#xff0c;下载文件 wget https://vscode.download.prss.microsoft.com/dbazure/download/stable/e3550cfac4b63ca4eafca7b601f0d2885817fd1f/code…

sql的关键字 limit 和offset

核心概念LIMIT (限制): 指定查询最多返回多少行记录。OFFSET (偏移): 指定在开始返回记录之前要跳过多少行记录。它定义了结果集的起始点。核心前提&#xff1a; 必须 使用 ORDER BY 子句来确保分页结果的顺序稳定和可预测。示例&#xff1a; 假设 employees 表有 100 条记录&a…