C++-指針

在C++中,指針是至關重要的組成部分。它是C++語言最強大的功能之一,也是最棘手的功能之一。 指針具有強大的能力,其本質是協助程序員完成內存的直接操縱。

指針:特定類型數據在內存中的存儲地址,即內存地址。

指針變量的定義語法: 先聲明,后賦值:

變量類型 * 指針變量名;       // 聲明
指針變量名 = 內存地址值;     // 賦值int num = 10;
int * p;		// 聲明
p = #	// 賦值

- 變量類型(如上int)表示,指針(內存地址)指向的內存區域,存放的是整型數據 ? ? ? ? ? ? ?

- *符號有兩種含義: ?? ??? ??? ?

- 聲明時:*p,表示變量p,是指針變量(存的是內存地址) ?? ??? ??? ?

- 使用時:*p,表示取指針p執行內存區域的數據 ? ? ? ? ? ? ?

- &符號表示取變量內存地址,是一個取內存地址的單目操作符

野指針和空指針

野指針:被聲明但未初始化(賦值)的指針。這個指針會指向隨機的內存空間,可能導致未知問題。

int * p;    // 聲明指針(分配了8字節空間), p是野指針因為未被賦值
*p = 10;    // 將10賦予指針p所指向的空間

*p = 10;是向未知的、隨機的4字節內存區域,修改存儲值為10

為避免野指針,應養成良好的變成習慣,及時初始化,或將指針置為空指針更為安全

int * p = NULL;
int * p = nullptr;

指針運算

int num = 10;
int *p = #
cout << p << endl;    // 結果:0x20d1ff6e4;
cout << p++ << endl;    // 結果:0x20d1ff6e8

指針進行加減運算的結果,和指針指向內存區域的數據類型有關,以加法為例:

char 類型指針 +1, 地址+1 (字節)

int 類型指針+1, 地址+4(字節)

double 類型指針+1, 地址+8 (字節)

指針運算

數組對象本身記錄的是內存地址(第一個元素地址) 可以通過指針運算,完成使用指針存取數組元素。

int v[] = {1, 2, 3, 4, 5};
int *p = v;
*p = 11;                // 賦值數組第一個元素
*(p+1) = 22;            // 賦值數組第二個元素
*(p+2) = 33;            // 賦值數組第三個元素
cout << *p << endl;     // 取數組第一個元素
cout << *(p+1) << endl; // 取數組第二個元素
cout << *(p+2) << endl; // 取數組第三個元素

動態內存分配

動態內存分配:即由程序員手動的進行內存空間的分配、內存空間的釋放等內存管理操作。

C++代碼中,變量、數組等對象的創建,是由C++自動分配內存的,稱之為(自動)靜態內存分配。

(自動)靜態內存管理,是不會進行內存空間的自動清理的。(無垃圾回收機制) 我們需要手動的管理內存,即手動分配,用完清理。

手動管理方式:

new運算符申請空間,提供該空間的指針(地址)

delete運算符申請的空間,僅用于new申請的空間

建議:寫完new后,立刻寫delete,然后再寫業務邏輯代碼

int * p = new int;      // 申請int類型(4字節)空間
int * p = new double;   // 申請double類型(8字節)空間
delete p;               // 刪除申請的空間
int * p = new int[5];   // 申請5元素int數組空間
delete[] p;             // 刪除申請的5元素數組空間

優勢: 手動控制內存,避免內存空間浪費

劣勢: 考驗程序員水平,用的好效率高,用不好有反效果

new

new運算符用于申請并分配內存空間 并提供指向該空間的指針(內存地址) 基本語法:

new type 申請普通變量空間

new type[n] 申請數組空間

delete

delete運算符用于釋放內存 僅可用于new運算符申請的內存區域

基本語法:

delete 指針 刪除普通變量空間

delete[] 指針 刪除數組空間

數組元素的插入舉例:

#include "iostream"
using namespace std;/* 在下標1和3插入數字:11和66 */int main()
{// 示例數組int * pArr = new int[5] {1, 3, 5, 7, 9};// 創建新數組int * pNewArr = new int[7];// 循環新數組,挨個進行元素填充(非插入的位置,填充老數組元素,插入位置填充新元素)int offset = 0;     // 偏移量用來控制新老數組元素的下標對照for (int i = 0; i < 7; i++){if (i == 1){// 走到了下標1,應當執行新元素插入pNewArr[i] = 11;offset++;       // 每插入一個新元素,offset+1continue;} else if (i == 3){// 走到了下標3,應當執行新元素插入pNewArr[i] = 66;offset++;       // 每插入一個新元素,offset+1continue;}// 不是插入位置,從老數組中提取元素放入新數組中// 公式:老數組的元素下標 + offset = 新數組元素下標// 當前循環的i是新數組的元素下標pNewArr[i] = pArr[i-offset];}// 收尾工作delete[] pArr;pArr = pNewArr;// 將新數組的內容輸出for (int i = 0; i< 7; i++){cout << pNewArr[i] << ",";}return 0;
}

數組元素的刪除舉例:

#include "iostream"
using namespace std;int main()
{// 示例數組int * pArr = new int[5] {1, 3, 5, 7, 9};// 創建一個新的數組,將需要保留的復制到新數組中int * pNewArr = new int[4];// 循環去遍歷老的數組,將需要的元素放入新數組中(不要的要跳過)for (int i = 0; i < 5; i++){if (i == 2){continue;}if (i > 2){pNewArr[i-1] = pArr[i];}else{pNewArr[i] = pArr[i];}}// 可選delete[] pArr;      // 回收老數組的空間(可選,根據需要來說)// 可選pArr = pNewArr;     // 將老數組的指針指向新數組的內存空間(可選,根據需要)for (int i = 0; i < 4; i++){cout << "新數組的元素是:" << pNewArr[i] << endl;cout << "新數組的元素是:" << pArr[i] << endl;}return 0;
}

指針懸掛:

指針指向區域已經被回收(delete),這種問題稱之為:指針懸掛。

不要輕易進行指針之間相互賦值

delete回收空間前,確保此空間100%不再被使用

錯誤示范:

int main()
{   int * p1 = new int;int * p2 = p1;  // 將p1賦值給p2*p1 = 10;   delete p1;cout << "p2指針記錄的是:" << *p2 << endl;return 0;
}

const指針

const是C++關鍵字,被譯為常量,const指針即表示:常量指針。

const用來修飾常量(不可更改),可以配合指針使用 以int為例。

const int * p; 指向常量的指針,即存儲值不可變,但指針可修改指向

int * const p = 地址; 常量指針

存儲的值可以變 指著不可修改指向 必須初始化指針的地址

const int * const p = 地址; 指向常量的常量指針

存儲的值和指針的指向,均不可修改

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

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

相關文章

2024.5組隊學習——MetaGPT(0.8.1)智能體理論與實戰(下):多智能體開發

傳送門&#xff1a; 《2024.5組隊學習——MetaGPT&#xff08;0.8.1&#xff09;智能體理論與實戰&#xff08;上&#xff09;&#xff1a;MetaGPT安裝、單智能體開發》《2024.5組隊學習——MetaGPT&#xff08;0.8.1&#xff09;智能體理論與實戰&#xff08;中&#xff09;&…

ModelBuilder之GDP空間化——批量值提取

一、前言 前面明確說到對于空間化過程中其實只有兩個過程可以進行批量操作,一個是我們燈光指數提取過程和批量進行值提取,這里補充一點,對于燈光指數計算可以實現批量計算總燈光指數和平均燈光指數,綜合燈光指數需要用平均燈光指數乘以面積占比求得,面積比就是(DN大于0的…

VS2022通過C++網絡庫Boost.asio搭建一個簡單TCP異步服務器和客戶端

基本介紹 上一篇博客我們介紹了通過Boost.asio搭建一個TCP同步服務器和客戶端&#xff0c;這次我們再通過asio搭建一個異步通信的服務器和客戶端系統&#xff0c;由于這是一個簡單異步服務器&#xff0c;所以我們的異步特指異步服務器而不是異步客戶端&#xff0c;同步服務器在…

BGP選路規則

配置地址&#xff0c;AS123使用ospf保證通訊&#xff0c;修改接口類型保證ospf學習環回20.0,30.0,100.0 地址時&#xff0c;是以24位掩碼學習&#xff0c;R1&#xff0c;R2&#xff0c;R3都處于BGP邊界&#xff0c;各自都需要宣告三者的私網環回 1&#xff0c; [R4]ip ip-prefi…

點分治練習

P3806 【模板】點分治 1 #include <bits/stdc.h> using namespace std;inline long long read() {char ch getchar();long long f 1,x 0;while (ch > 9 || ch < 0) { if (ch -)f -1; ch getchar(); }while (ch > 0 && ch < 9) { x (x <&l…

Thrift學習深入

Thrift學習深入 https://zhuanlan.zhihu.com/p/22934974 https://zhuanlan.zhihu.com/p/26993406 從具體的demo入手,我們需要學習的是三部分 IDLserver端client端一、IDL深入 IDL定義的通用類型有: 基礎數據類型結構體容器 list、set、map異常:語法與結構體無異,不過用…

第十二周筆記

微信小程序的自定義事件是指開發者可以自行定義并觸發的事件&#xff0c;以實現特定的功能或邏輯。通過自定義事件&#xff0c;開發者可以更靈活地管理小程序的交互和數據流動&#xff0c;提升用戶體驗和開發效率。下面我將詳細講解微信小程序自定義事件&#xff0c;包括定義、…

容器化部署

目錄 docker容器化部署 怎樣使用Docker Compose或Kubernetes等容器編排工具來管理和擴展聯邦學習系統 使用Docker Compose

【Qnx 】Qnx IPC通信PPS

Qnx IPC通信PPS Qnx自帶PPS服務&#xff0c;PPS全稱Persistent Publish/Subscribe Service&#xff0c;就是常見的P/S通信模式。 Qnx PPS的通信模式是異步的&#xff0c;Publisher和Subscriber也無需關心對方是否存在。 利用Qnx提供的PPS服務&#xff0c;Publisher可以通知多…

嵌入式進階——LED呼吸燈(PWM)

&#x1f3ac; 秋野醬&#xff1a;《個人主頁》 &#x1f525; 個人專欄:《Java專欄》《Python專欄》 ??心若有所向往,何懼道阻且長 文章目錄 PWM基礎概念STC8H芯片PWMA應用PWM配置詳解占空比 PWM基礎概念 PWM全稱是脈寬調制&#xff08;Pulse Width Modulation&#xff09…

Arduino下載與安裝(Windows 10)

Arduino下載與安裝(Windows 10) 官網 下載安裝 打開官網&#xff0c;點擊SOFTWARE&#xff0c;進入到軟件下載界面&#xff0c;選擇Windows 選擇JUST DOWNLOAD 在彈出的界面中&#xff0c;填入電子郵件地址&#xff0c;勾選Privacy Policy&#xff0c;點擊JUST DOWNLOAD即可 …

深入解析:Element Plus 與 Vite、Nuxt、Laravel 的結合使用

在現代前端開發中&#xff0c;選擇合適的工具和框架來提高開發效率和應用性能是至關重要的。 Element-Plus 是一個基于 Vue.js 3.0 的流行 UI組件庫&#xff0c;它可以與多種前端和后端框架結合使用&#xff0c;如 Vite、Nuxt 和 Laravel。本文將深入探討這三者與 Element Plus…

【腳本篇】---spyglass lint腳本

目錄結構 sg_lint.tcl &#xff08;頂層&#xff09; #1.source env #date set WORK_HOME . set REPORT_PATH ${WORK_HOME}/reports puts [clock format [clock second] -format "%Y-%m-%d %H:%M:%S"] #2.generate source filelist #3.set top module puts "##…

qt-C++筆記之QThread使用

qt-C筆記之QThread使用 ——2024-05-26 下午 code review! 參考博文&#xff1a; qt-C筆記之使用QtConcurrent異步地執行槽函數中的內容&#xff0c;使其不阻塞主界面 qt-C筆記之QThread使用 文章目錄 qt-C筆記之QThread使用一:Qt中幾種多線程方法1.1. 使用 QThread 和 Lambda…

ubuntu server 24.04 網絡 SSH等基礎配置

1 安裝參考上一篇: VMware Workstation 虛擬機安裝 ubuntu 24.04 server 詳細教程 服務器安裝圖形化界面-CSDN博客 2 網絡配置 #安裝 sudo apt install net-tools#查看 ifconfig #修改網絡配置 sudo vim /etc/netplan/50-cloud-init.yaml network:version: 2ethernets:en…

課時136:變量進階_變量實踐_高級賦值

2 變量進階 2.1 變量實踐 2.1.1 高級賦值 學習目標 這一節&#xff0c;我們從 基礎知識、簡單實踐、小結 三個方面來學習 基礎知識 簡介 所謂的高級賦值&#xff0c;是另外的一種變量值獲取方法&#xff0c;這里涉及到更多我們學習之外的一些shell內置變量格式,其實這部分…

飛雞:從小訓練飛行的雞能飛行嗎?為什么野雞能飛嗎?是同一品種嗎?今天自由思考

雞的飛行能力在很大程度上受到其生理結構的限制。盡管雞有翅膀&#xff0c;但與能夠長時間飛行的鳥類相比&#xff0c;雞的翅膀相對較小&#xff0c;且胸部肌肉較弱。再加上雞的身體較重&#xff0c;這些因素共同限制了雞的飛行能力。通常&#xff0c;雞只能進行短暫的、低空的…

【wiki知識庫】01.wiki知識庫前后端項目搭建(SpringBoot+Vue3)

&#x1f4dd;個人主頁&#xff1a;哈__ 期待您的關注 &#x1f33c;環境準備 想要搭建自己的wiki知識庫&#xff0c;要提前搭建好自己的開發環境&#xff0c;后端我使用的是SpringBoot&#xff0c;前端使用的是Vue3&#xff0c;采用前后端分離的技術實現。同時使用了Mysql數…

C++ vector,dequeu,list容器中元素的引用失效問題

文章目錄 一、std::list不會產生引用失效問題二、std::vector中元素引用失效問題三、std::deque中元素引用失效問題 一、std::list不會產生引用失效問題 在C中&#xff0c;std::list&#xff08;雙向鏈表&#xff09;提供了一種非常靈活的容器類型&#xff0c;其設計使其在插入…