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
英文地址,請注明出處:http://en.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…