C++學習筆記4

什么是指針?
指針是存儲內存地址的變量。就像int變量用于存儲整數值一樣,指針變量用于存儲內存地址。指針是一種指向內存單元的特殊變量。

內存單元地址通常使用的是16進制表示(0~9和A~F)來表示數字。顯示16進制數時,通常使用前綴0x。

聲明指針:作為一種變量,指針也需要聲明。通常將指針聲明為聲明為指向特定的類型。如int,者意味著指針包含的地址對應的內存單元存儲了一個整數。
PointedType * PointerVariableName;

注意:除非對指針進行初始化,否則它包含的將是垃圾值。對于指針來說,這種垃圾值非常危險,因為指針包含的值被視為地址。未初始化的指針可能導致程序訪問非法內存單元,進而導致程序崩潰。因此將指針初始化為NULL。

使用引用運算符(&)獲取變量的地址
int age = 30;
&age 將是存儲該變量的值(30)的內存的地址。

使用指針存儲地址
int age = 30;
int* pAage = &age;

給指針重新賦值,使其指向另外一個變量

動態內存分配
如果在程序中使用下面這樣的數組聲明:
int myNums[100];
程序存在兩個問題:
1.這限制了程序的容量,無法存儲100個以上的數字
2.如果只需存粗1個數組,卻為100個數字預留存儲空間,這將降低系統的性能。
原因:數組的內存分配是靜態和固定的。

使用new和deldete動態地分配和釋放內存

使用new來分配新的內存塊,通常情況下,如果成功,new將返回指向一個指針,指向分配的內存,否則將引發異常。使用new時,需要指定要為哪種數據類型分配內存。
Type* p = new Type;

需要為多個元素分配內存時,還可指定要為多少個元素分配內存
Type * p = new Type[num];

舉例:
int* p = new int;
int* p = new int[10];

注意:使用new分配的內ucn最終都需使用對應的delete進行釋放。
delete p;
delet[] p;

將關鍵字const用于指針
1.指針包含的地址是常量,不能修改,但可修改指針指向的數據
int day = 30;
int* const p = &day;
*p = 31;//OK!Data pointed to can be changed
int day2 = 28;
p = &day2;//Not OK! Cannot change address!

2.指針指向的數據為常量,不能修改,但可以修改指針包含的地址,即指針可以指向其他的地方。
int a = 24;
const int* p = &a;
int b = 12;
p = &b;//OK
*p = 13;//Not OK

3.指針包含的地址以及它指向的值都是常量,不能修改
int a = 24;
const int* const p = &a;
*p = 13;//Not ok
int b = 12;
p = &b;//Not Ok

使用指針時常犯的編程錯誤
1.內存泄漏
如果使用new動態分配的內存不再需要后,程序員沒有使用配套的delete釋放。

2.指針指向無效的內存單元
在使用*對指針解除引用,以訪問指向的值時,務必確保指針指向有效的內存單元,否則程序要么崩潰,要么行為不端。

指針編程應該遵守一些基本原則
1.務必初始化指針變量,否則它將包含垃圾值,初始化NULL
2.務必僅再指針有效時才使用它,否則程序可能崩潰
3.對于使用new分配得內存,一定要記得使用delete進行釋放,否則應用程序將泄漏內存,進而降低系統得性能。
4.使用delete釋放內存塊或指針后,不要訪問它
5.不要對同一個內存地址調用多次delete
6.使用完動態分配得內存塊后,被網絡對其調用delete

引用是變量得別名。聲明引用時,需要將其初始化為一個變量,因此引用只是另一種訪問相應變量存儲數據得方式。

要聲明引用,可使用引用運算符&
VarType original = value;
VarType& ReferenceVariable = original;

using namespace std;
int main(){
int a= 30;
cout << “a=” << a << endl;
cout << “a is at address:” << &a << endl;

int*& b = a;
cout << "b is at address:" << &b << endl;
}

輸出:a 和 b 的地址相同
因此,引用是真正的別名,即相應變量的另一個名字

是什么讓引用很有用?
引用讓您能夠訪問相應變量所在的內存單元。
using namespce std;
void GetSquare(int& number){
number*= number;
}

int main(){
cout << “Enter a number you wish to square”;
int number = 5;

GetSquare(number);
cout << "number = " << number << endl;

}
輸出:25

將關鍵字const用于引用
需要禁止通過引用修改它指向的變量的值,為此可在聲明引用時使用關鍵子const
int a = 30;
const int& b = a;
b = 45;//Not allowed:constRef can’t change value in original
int& c = b;//Not allowed.c is not const

問與答
1.我聲明了兩個指針
int* a = new int;
int* b = a;為了釋放內存,是否需要對他們都調用delete?
答:這樣做是錯誤的,對new返回的地址,只能調用delete一次,最好避免讓兩個指針指向相同的地址,因為對其中一個調用delete將導致另外一個無效。

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

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

相關文章

React源碼解析18(6)------ 實現useState

摘要 在上一篇文章中&#xff0c;我們已經實現了函數組件。同時可以正常通過render進行渲染。 而通過之前的文章&#xff0c;beginWork和completeWork也已經有了基本的架子。現在我們可以去實現useState了。 實現之前&#xff0c;我們要先修改一下我們的index.js文件&#x…

DAY2,ARM(特殊功能寄存器,數據操作指令,跳轉指令)

1.cmp、sub、b指令的使用&#xff1b; 代碼&#xff1a; .text .global _start _start:mov r0,#9mov r1,#15loop:cmp r0,r1beq stopsubcc r1,r1,r0subhi r0,r0,r1b loopstop:b stop .end結果&#xff1a; 2.匯編指令計算1~100之間和&#xff1b; 代碼&#xff1a; .text .gl…

【從零學習python 】47. 面向對象編程中的繼承概念及基本使用

文章目錄 繼承的基本使用代碼逐行講解說明:進階案例 繼承的基本使用 在現實生活中&#xff0c;繼承一般指的是子女繼承父輩的財產&#xff0c;父輩有的財產&#xff0c;子女能夠直接使用。 程序里的繼承 繼承是面向對象軟件設計中的一個概念&#xff0c;與多態、封裝共為面向對…

Android 13 Launcher——屏蔽上拉到應用列表

背景 Launcher定制需要將原先的應用列表去掉,可以從根源去掉,就是將上拉出現應用列表的上拉手勢直接屏蔽,讓其不能上拉出現應用列表界面,在研究的過程中順便將下拉出現負一屏的邏輯也研究了下,如下就是具體實現。 目錄 背景 一.如何屏蔽上拉出現應用列表 一.如何屏蔽上拉…

培訓報名小程序-用戶注冊

目錄 1 創建數據源2 注冊用戶3 判斷用戶是否注冊4 完整代碼總結 我們的培訓報名小程序&#xff0c;用戶每次打開時都需要填寫個人信息才可以報名&#xff0c;如果用戶多次報名課程&#xff0c;每次都需要填寫個人信息&#xff0c;比較麻煩。 本篇我們就優化一下功能&#xff0c…

線上售樓vr全景看房成為企業數字化營銷工具

在房地產業中&#xff0c;VR全景拍攝為買家提供了虛擬看房的全新體驗。買家可以通過相關設備&#xff0c;遠程參觀各個樓盤的樣板間和實景&#xff0c;感受房屋的空間布局和環境氛圍&#xff0c;極大地提高了購房決策的準確性。對于房地產開發商和中介機構來說&#xff0c;VR全…

@Async用哪個線程池

一共可以分三種情況 第一種 未在手動在項目中配置任何線程池 spring boot 會默認添加一個coreSize8的 無界線程池&#xff0c;名稱為applicationTaskExecutor &#xff08;源碼&#xff1a;org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration&…

如何搭建個人郵件服務hmailserver并實現遠程發送郵件

文章目錄 1. 安裝hMailServer2. 設置hMailServer3. 客戶端安裝添加賬號4. 測試發送郵件5. 安裝cpolar6. 創建公網地址7. 測試遠程發送郵件8. 固定連接公網地址9. 測試固定遠程地址發送郵件 hMailServer 是一個郵件服務器,通過它我們可以搭建自己的郵件服務,通過cpolar內網映射工…

計算機競賽 GRU的 電影評論情感分析 - python 深度學習 情感分類

1 前言 &#x1f525;學長分享優質競賽項目&#xff0c;今天要分享的是 &#x1f6a9; GRU的 電影評論情感分析 - python 深度學習 情感分類 &#x1f947;學長這里給一個題目綜合評分(每項滿分5分) 難度系數&#xff1a;3分工作量&#xff1a;3分創新點&#xff1a;4分 這…

代碼隨想錄算法訓練營第三十八天 | 理論基礎,509. 斐波那契數,70. 爬樓梯,746. 使用最小花費爬樓梯

代碼隨想錄算法訓練營第三十八天 | 理論基礎&#xff0c;509. 斐波那契數&#xff0c;70. 爬樓梯&#xff0c;746. 使用最小花費爬樓梯 理論基礎什么是動態規劃動態規劃的解題步驟動態規劃應該如何debug 509. 斐波那契數遞歸解法 70. 爬樓梯746. 使用最小花費爬樓梯 理論基礎 視…

計蒜客T1170——人民幣支付

超級水&#xff0c;不解釋&#xff0c;代碼的處理方式減低了繁瑣程度&#xff0c; #include <iostream> using namespace std;int main(int argc, char** argv) {int num0;cin>>num;int money[6]{100,50,20,10,5,1};for(int i0;i<5;i){int count0;countnum/mone…

SkyWalking 部署(包含ES)

SkyWalking安裝 結構 首先SkyWalking主要需要oapService、webApp、Elasticsearch&#xff08;可選存儲&#xff09;三個&#xff0c;接下來講一下這三個的安裝步驟&#xff0c;安裝過程中出現了一些細小的配置錯誤&#xff0c;導致用了快兩天才弄好&#xff0c;麻木了&#x…

C++超基礎語法

&#x1f493;博主個人主頁:不是笨小孩&#x1f440; ?專欄分類:數據結構與算法&#x1f440; C&#x1f440; 刷題專欄&#x1f440; C語言&#x1f440; &#x1f69a;代碼倉庫:笨小孩的代碼庫&#x1f440; ?社區&#xff1a;不是笨小孩&#x1f440; &#x1f339;歡迎大…

IDEA常用工具配置

IDEA常用工具&配置 如果發現插件市場用不了&#xff0c;可以設置Http Proxy&#xff0c;在該界面上點擊”Check connection“并輸入的地址&#xff1a;https://plugins.jetbrains.com/ 。 一、常用插件 1、MybatisX Mybaits Plus插件&#xff0c;支持java與xml互轉 2、F…

Vue-10.集成.env

.env、.env.development 和 .env.preview .env、.env.development 和 .env.preview 文件是用于配置環境變量和應用程序設置的文件&#xff0c;它們在項目開發和部署過程中起到關鍵作用。這些文件用于在不同的環境中設置不同的變量值&#xff0c;以滿足不同環境下的配置需求。 …

日志系統——日志格式化模塊設計

一&#xff0c;模塊主要成員 該模塊的主要作用是對日志消息進行格式化&#xff0c;將日志消息組織成制定格式的字符串。 該模塊主要成員有兩個&#xff1a;1.格式化字符串。 2.格式化子項數組 1.1 格式化字符串 格式化字符串的主要功能是保存日志輸出的格式字符串。其格式化字…

WPF 界面結構化處理

文章目錄 概要一、xaml界面結構化處理二、邏輯樹與視覺樹 概要 WPF 框架是開源的&#xff0c;但是不能跨平臺&#xff0c;可以使用MAUI&#xff0c;這個框架可以跨平臺&#xff0c;WPF源碼可以在github上下載&#xff0c;下載地址&#xff1a;https://gitbub.com/dotnet/wpf。…

【C++ 記憶站】命名空間

文章目錄 命名空間概念命名空間的定義1、正常的命名空間定義2、命名空間可以嵌套3、同一個工程中允許存在多個相同名稱的命名空間,編譯器最后會合成同一個命名空間中 命名空間的使用1、加命名空間名稱及作用域限定符2、使用using將命名空間中某個成員引入3、使用using namespac…

初試時間官宣!研招網發布下半年重要時間節點!今日速報來了

距24考研初試還有127天&#xff0c;今天給大家帶來初試和報名時間官宣消息、考研報名注意事項、研招網發布的2024考研“保姆級”下半年重要時間節點。有用記得收藏 24考研報名和初試時間官宣 已有學校在招生簡章中明確24考研初試時間 初試時間預計為&#xff1a;2023年12月23…

初試rabbitmq

rabbitmq的七種模式 Hello word 客戶端引入依賴 <!--rabbitmq 依賴客戶端--><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0</version></dependency> 生產者 imp…