解鎖C++:指針與數組、字符串的深度探秘

目錄

一、指針與數組:親密無間的伙伴

1.1 指針是數組的 “快捷通道”

1.2 數組名與指針:微妙的差別

1.3 動態數組:指針大顯身手

二、指針與字符串:千絲萬縷的聯系

2.1 字符指針與 C 風格字符串

2.2 指針與 std::string 類

2.3 字符串常量與指針

三、指針在數組和字符串操作中的實際應用

3.1 字符串操作函數中的指針運用

3.2 數組排序:指針優化效率

3.3 復雜數據結構構建:指針串聯數組與字符串

四、總結與展望


一、指針與數組:親密無間的伙伴

        在 C++ 的編程世界里,指針與數組就像一對親密無間的伙伴,它們之間的關系既緊密又微妙。理解它們之間的關系,是掌握 C++ 編程的關鍵。

1.1 指針是數組的 “快捷通道”

        在 C++ 中,指針可以被看作是訪問數組元素的 “快捷通道”。從內存層面來看,數組在內存中是連續存儲的,數組名實際上就是數組首元素的地址。這就意味著,我們可以通過指針來直接訪問數組元素,而不需要通過數組下標來進行間接訪問。這種方式不僅提高了訪問效率,還為我們提供了更加靈活的操作方式。

        例如,我們有一個整型數組arr,可以定義一個指針p指向數組的首元素:

int arr[5] = {1, 2, 3, 4, 5};int *p = arr;

        通過指針p,我們可以使用*p來訪問數組的第一個元素,使用*(p + 1)來訪問數組的第二個元素,以此類推。這種方式與使用數組下標arr[0]、arr[1]等效果是一樣的,但在某些情況下,指針操作更加高效。比如,在遍歷數組時,使用指針可以避免每次都進行數組下標的計算,從而提高程序的執行速度:

for (int i = 0; i < 5; i++) {cout << *p << " ";p++;}

1.2 數組名與指針:微妙的差別

        雖然數組名和指針在很多情況下表現得極為相似,但它們之間還是存在一些微妙的差別。數組名本質上是一個常量指針,它指向數組的首元素,并且這個指針的值是固定不變的。這意味著我們不能對數組名進行賦值操作,也不能對其進行自增、自減等改變其值的操作。

例如,下面的代碼是錯誤的:

int arr[5] = {1, 2, 3, 4, 5};arr++; // 錯誤,數組名是常量,不能自增int *p = arr;p++; // 正確,指針是變量,可以自增

        另外,當我們使用sizeof運算符時,對數組名和指針的計算結果也不同。對數組名使用sizeof,得到的是整個數組占用的內存大小;而對指針使用sizeof,得到的是指針本身的大小(通常在 32 位系統上是 4 個字節,在 64 位系統上是 8 個字節)。

int arr[5] = {1, 2, 3, 4, 5};int *p = arr;cout << sizeof(arr) << endl; // 輸出數組占用的內存大小,例如20(假設int占4個字節)cout << sizeof(p) << endl; // 輸出指針的大小,例如4或8

1.3 動態數組:指針大顯身手

        在 C++ 編程中,我們常常需要根據實際需求動態地分配和釋放內存,這時候指針就大顯身手了。通過使用new和delete運算符,我們可以利用指針來創建和銷毀動態數組。

        例如,下面的代碼展示了如何使用指針動態分配一個包含 10 個整數的數組:

int *dynamicArray = new int[10];

        這里,new int[10]在堆內存中分配了一塊連續的空間,用于存儲 10 個整數,并返回指向這塊空間首地址的指針,將其賦值給dynamicArray。在使用完動態數組后,我們必須使用delete[]來釋放分配的內存,以避免內存泄漏:

delete[] dynamicArray;

        內存管理是 C++ 編程中的一個重要環節,如果我們忘記釋放動態分配的內存,就會導致內存泄漏,這可能會使程序的性能逐漸下降,甚至導致程序崩潰。因此,在使用動態數組時,一定要養成及時釋放內存的好習慣。

二、指針與字符串:千絲萬縷的聯系

        在 C++ 編程中,指針與字符串之間也有著千絲萬縷的聯系。無論是 C 風格的字符串,還是 C++ 標準庫中的std::string類,指針都在其中扮演著重要的角色。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/72331.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/72331.shtml
英文地址,請注明出處:http://en.pswp.cn/web/72331.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

20250315-OpenAI-AgentSDK實驗

湊熱鬧。可以用GLM跑。 這里暫時用GLM底座“魔鬼修改”&#xff0c;代碼庫僅供參考&#xff08;共同進步吧&#xff09; openai-agents-python-glm: 基于GLM底座運行SDK&#xff0c;學習實驗SDK內的mAGT功能。https://gitee.com/leomk2004/openai-agents-python-glm 自言自語&a…

Qt QML實現彈球消磚塊小游戲

前言 彈球消磚塊游戲想必大家都玩過&#xff0c;很簡單的小游戲&#xff0c;通過移動擋板反彈下落的小球&#xff0c;然后撞擊磚塊將其消除。本文使用QML來簡單實現這個小游戲。 效果圖&#xff1a; 正文 代碼目錄結構如下&#xff1a; 首先是小球部分&#xff0c;邏輯比較麻…

04_Linux驅動_05_pinctrl子系統

以下代碼都在pinctrl相關的驅動函數和設備樹中 pinctrl-rockchip.c驅動&#xff0c;對應的是那個&#xff08;那些&#xff09;設備樹呢&#xff1f; 答案&#xff1a;通過.compatible "rockchip,rk3568-pinctrl"連接到rk3568.dtsi根節點下的pinctrl節點 一&#…

Python的那些事第四十五篇:繼承自Nose的測試框架Nose2

Nose2:繼承自Nose的測試框架 摘要 本文深入探討了Nose2這一繼承自Nose的測試框架。在軟件開發過程中,測試是確保代碼質量和穩定性的重要環節,而測試框架為測試工作的開展提供了有力支持。Nose2作為Nose的繼承者,在保留Nose優勢的基礎上進行了諸多改進和擴展,為Python測試…

如何通過 Airbyte 將數據攝取到 Elasticsearch

作者&#xff1a;來自 Elastic Andre Luiz Airbyte 是一個數據集成工具&#xff0c;可自動化并可擴展地將信息從各種來源傳輸到不同的目的地。它使你能夠從 API、數據庫和其他系統提取數據&#xff0c;并將其加載到 Elasticsearch 等平臺&#xff0c;以實現高級搜索和高效分析。…

RBAC 模型的簡單實現

RBAC 模型基本介紹 RBAC&#xff08;Role-Based Access Control&#xff0c;基于角色的訪問控制&#xff09;是一種廣泛應用的權限管理模型。它的核心思想是通過角色來管理權限&#xff0c;而不是直接分配權限給用戶。用戶被賦予一個或多個角色&#xff0c;而每個角色擁有不同…

數據結構---堆棧和列

一、堆棧 1.棧堆&#xff1a;具有一定操作約束的線性表&#xff1b;&#xff08;只在一端做插入刪除&#xff09; 2.棧的順序存儲結構&#xff1a; 由一個一維數組和一個記錄棧頂元素位置的變量組成。定義方式如下&#xff1a; 3.入棧操作&#xff1a; 注意&#xff1a;&…

2023 年全國職業院校技能大賽(中職組)移動應用與開發賽項 賽題第十套

2023 年全國職業院校技能大賽&#xff08;中職組&#xff09;移動應用與開發賽項 賽題第十套&#xff09; 移動應用與開發賽項競賽模塊 A&#xff1a;移動應用界面設計任務 1 環保中心界面設計&#xff08;7.5 分&#xff09;任務 2&#xff1a;首頁界面設計&#xff08;7.5 分…

FPGA為何要盡量減少組合邏輯的使用

在FPGA設計中&#xff0c;組合邏輯的使用確實需要謹慎&#xff0c;尤其是要盡量減少它的復雜性。這并不是因為組合邏輯本身不好&#xff0c;而是因為它在實際應用中容易引發一系列問題&#xff0c;而這些問題往往與FPGA的設計哲學和硬件特性相沖突。讓我從幾個關鍵點來和你聊聊…

c語言筆記 字符串函數---strcmp,strncmp,strchr,strrchr

目錄 函數strcmp與strncmp 以下是錯誤的示范&#xff1a;兩個指針字符型的指針不能直接進行比較 函數strchr與函數strrchr 函數strchr與函數strrchr與strstr函數三者對比 背景&#xff1a;如果說我們要比較兩個字符串是否相等&#xff0c;使用strcmp或者strncmp函數。在c語言中…

合React寶寶體質的自定義節流hook

本文為開發開源項目的真實開發經歷&#xff0c;感興趣的可以來給我的項目點個star&#xff0c;謝謝啦~ 具體博文介紹&#xff1a; 開源&#xff5c;Documind協同文檔&#xff08;接入deepseek-r1、支持實時聊天&#xff09;Documind &#x1f680; 一個支持實時聊天和接入 - 掘…

【RTSP】客戶端(五)H264 265處理邏輯

H264處理邏輯 整體邏輯分析 實現邏輯 解析 RTP 包頭&#xff1a;首先檢查 RTP 頭部的有效負載類型&#xff08;payloadType&#xff09;是否匹配處理擴展頭&#xff1a;如果 RTP 包包含擴展頭&#xff0c;跳過擴展頭部分&#xff0c;獲取有效負載處理分片數據&#xff1a;H264…

IDEA集成git,項目的克隆,遠程倉庫中文件的添加刪除

目錄 一、克隆項目 二、使用IDEA完成文件的上傳和刪除 1.配置git 2.上傳 3.刪除&#xff08;通過git bash&#xff09; 一、克隆項目 點擊克隆&#xff0c;復制url &#xff0c;如下 打開你想要克隆到哪里&#xff0c;右擊&#xff0c;選擇 open Git Bash here 這一步之后…

神經網絡:定義與核心原理

神經網絡&#xff08;Artificial Neural Network, ANN&#xff09;是一種受生物神經系統啟發的計算模型&#xff0c;旨在通過模擬神經元之間的連接與信息傳遞機制&#xff0c;實現復雜的數據處理和模式識別功能。其本質是由大量簡單處理單元&#xff08;神經元&#xff09;構成…

將pdf或者word轉換成base64格式

廢話不多說直接上代碼&#xff1a; function fileToBase64(file) {return new Promise((resolve, reject) > {const reader new FileReader();reader.readAsDataURL(file);reader.onload function (event) {const base64Data event.target.result.split(,)[1];resolve(b…

Spring @Bean注解使用場景二

bean:最近在寫一篇讓Successfactors顧問都能搞明白的sso的邏輯的文章&#xff0c;所以一致在研究IAS的saml2.0的協議&#xff0c;希望用代碼去解釋SP、idp的一些概念&#xff0c;讓顧問了解SSO與saml的關系&#xff0c;在github找代碼的時候發現一些代碼的調用關系很難理解&…

ubuntu22.04 關于掛在設備為nfts文件格式無法創建軟連接的問題

最近遇到情況&#xff0c;解壓工程報錯&#xff0c;無法創建軟連接 但是盤內還有130G空間&#xff0c;明顯不是空間問題&#xff0c;查找之后發現是移動硬盤的文件格式是NTFS&#xff0c;在ubuntu上不好兼容&#xff0c;于是報錯。 開貼記錄解決方案。 1.確定文件格式 使用命…

docker后臺運行,便于后期用命令行進入它的終端

在 docker compose up --build -d 命令中&#xff0c;?**-d?&#xff08;或 --detach&#xff09;參數的作用是讓容器以后臺模式&#xff08;detached mode&#xff09;?**運行。以下是詳細解釋&#xff1a; ?**-d 參數的作用** ?后臺運行容器&#xff1a; 默認情況下&a…

網頁制作14-Javascipt時間特效の顯示動態日期

<!doctype html> <html> <head> <meta charset"utf-8"> <title>動態日期</title> </head><script>var today new Date();//獲取時間var ytoday.getFullYear();//截取年var mtoday.getMonth();//截取月份,返回0~11v…