白騎士的C++教學進階篇 2.1 指針與引用

系列目錄

上一篇:白騎士的C++教學基礎篇 1.5?數據結構

????????指針和引用是C++中非常重要的概念,它們提供了強大的功能,使程序員能夠直接操作內存,提高程序的效率和靈活性。在本篇博客中,我們將深入探討指針與引用的基礎知識,以及它們的區別與使用場景。

指針基礎

????????指針是一種變量,用于存儲內存地址。通過指針,我們可以訪問和操作存儲在該地址上的數據。指針在C++中的基本用法如下:

指針的聲明與初始化

????????指針變量的聲明包括數據類型和一個星號 ‘*‘ 符號。例如,聲明一個指向整數的指針:

int* ptr;

????????可以使用取地址運算符 ‘&‘ 將變量的地址賦給指針,例如:

int value = 10;
ptr = &value;

????????此時,‘ptr‘ 指向變量 ‘value‘ 的內存地址。

訪問指針指向的值

????????使用解引用運算符 ‘*‘ 可以訪問指針指向的值:

int value = 10;
int* ptr = &value;std::cout << "Value: " << value << std::endl;
std::cout << "Pointer address: " << ptr << std::endl;
std::cout << "Pointer dereferenced: " << *ptr << std::endl;

????????在上面的代碼中,‘*ptr‘ 返回 ‘ptr‘ 指向的變量 ‘value‘ 的值。

指針運算

????????指針可以進行算術運算,例如遞增和遞減。對于指向數組元素的指針,這些運算特別有用,例如:

int arr[] = {1, 2, 3, 4, 5};
int* ptr = arr;std::cout << "First element: " << *ptr << std::endl;
ptr++;
std::cout << "Second element: " << *ptr << std::endl;

????????指針運算會根據指針所指向的數據類型自動調整步長。

引用基礎

????????引用是變量的別名,定義后必須被初始化。引用提供了一種更安全和簡潔的方式來操作變量,而不需要使用指針。

引用的聲明與初始化

????????引用的聲明使用‘&‘符號,并在聲明時進行初始化。例如,聲明一個引用:

int value = 10;
int& ref = value;

????????此時,‘ref‘ 是變量 ‘value‘ 的別名,對‘ref‘的操作與對 ‘value‘ 的操作完全相同,例如:

std::cout << "Value: " << value << std::endl;
std::cout << "Reference: " << ref << std::endl;ref = 20;std::cout << "Value after modification: " << value << std::endl;

????????在上面的代碼中,通過引用 ‘ref‘ 修改變量 ‘value‘ 的值。

引用作為函數參數

????????引用常用于函數參數,避免傳值帶來的拷貝開銷,同時允許函數直接修改傳入的變量,例如:

void increment(int& ref) {ref++;
}int main() {int num = 10;increment(num);std::cout << "Number after increment: " << num << std::endl;return 0;
}

????????在上面的代碼中,函數 ‘increment‘ 通過引用參數直接修改傳入的變量 ‘num‘ 的值。

指針與引用的區別與使用場景

????????指針和引用在功能上有一些相似之處,但它們在語法和使用場景上有重要的區別。

指針與引用的主要區別

  1. 初始化指針可以在聲明后再初始化,而引用必須在聲明時初始化。
  2. 空值指針可以指向空(‘nullptr‘),而引用必須引用有效的對象。
  3. 重定向指針可以在程序運行過程中重新指向不同的對象,而引用在初始化后不能更改其引用的對象。
  4. 語法簡潔性引用在使用時更加簡潔,語法上與普通變量無異,而指針需要使用‘*‘和‘&‘進行解引用和取地址操作。

使用場景

指針的使用場景

  1. 動態內存分配:指針用于操作堆上的動態內存,例如通過‘new‘和‘delete‘管理內存。
  2. 數據結構:指針常用于實現鏈表、樹等復雜數據結構。
  3. 指針數組:指針可以用于實現數組的動態大小和多維數組。

引用的使用場景

  1. 函數參數:引用常用于函數參數,避免傳值拷貝,提高效率。
  2. 返回值優化:引用可以用于函數返回值,避免拷貝開銷。
  3. 常量引用:用于避免函數參數的拷貝,同時保護參數不被修改。

????????通過以下示例代碼,我們可以更好地理解指針和引用的區別及其使用場景:

#include <iostream>// 使用指針實現動態內存分配
void dynamicMemoryExample() {int* ptr = new int(42);std::cout << "Dynamically allocated value: " << *ptr << std::endl;delete ptr;
}// 使用引用作為函數參數
void modifyByReference(int& ref) {ref *= 2;
}// 使用指針作為函數參數
void modifyByPointer(int* ptr) {*ptr *= 2;
}int main() {// 指針示例int value = 10;int* ptr = &value;std::cout << "Value before modification: " << value << std::endl;modifyByPointer(ptr);std::cout << "Value after modification by pointer: " << value << std::endl;// 引用示例int anotherValue = 20;std::cout << "Another value before modification: " << anotherValue << std::endl;modifyByReference(anotherValue);std::cout << "Another value after modification by reference: " << anotherValue << std::endl;// 動態內存分配示例dynamicMemoryExample();return 0;
}

總結

????????指針和引用是C++中強大的工具,理解它們的區別和使用場景對編寫高效、靈活的程序至關重要。指針提供了直接操作內存的能力,適用于動態內存分配和復雜數據結構,而引用提供了一種更簡潔的語法,適用于函數參數和返回值優化。在編程實踐中,合理選擇使用指針或引用可以大大提高代碼的可讀性和性能。希望通過本篇博客的介紹,您能更好地掌握指針和引用的用法,為深入學習C++奠定堅實的基礎。

下一篇:白騎士的C++教學進階篇 2.2 面向對象編程(OOP)

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

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

相關文章

從零開始學習嵌入式----Makefile工具

一、Makefile 簡明指南 你是否曾經面對過一堆源代碼文件&#xff0c;卻不知道如何將它們編譯成可執行文件&#xff1f;或者你是否厭倦了每次修改代碼后都要手動輸入冗長的編譯命令&#xff1f; 如果是的話&#xff0c;那么 Makefile 就是你的救星&#xff01; 二、Makefile 是什…

全網最適合入門的面向對象編程教程:14 類和對象的 Python 實現-類的靜態方法和類方法,你分得清嗎?

全網最適合入門的面向對象編程教程&#xff1a;14 類和對象的 Python 實現-類的靜態方法和類方法&#xff0c;你分得清嗎&#xff1f; 摘要&#xff1a; 本文主要介紹了Python中類和對象中的類方法和靜態方法&#xff0c;以及類方法和靜態方法的定義、特點、應用場景和使用方…

網安防御保護-小實驗

1、DMZ區內的服務器&#xff0c;辦公區僅能在辦公時間內(9:00-18:00)可以訪問&#xff0c;生產區的設備全天可以訪問 2、生產區不允許訪問互聯網&#xff0c;辦公區和游客區允許訪問互聯網 3、辦公區設備10.0.2.10不允許訪問DMZ區的FTP服務器和HTTP服務器&#xff0c;僅能ping通…

vue 環境變量那些事

常見的項目環境變量的使用 總則&#xff1a;使用 .env.環境名字文件去定義&#xff0c;運行命令的時候指定環境 比如&#xff1a;.env 代表所有環境變量使用的一些變量 .env.development 代表的開發環境變量 .env.production 代表的生產環境變量也就是上線以后使用的 vitevu…

自主研發接口測試框架

測試任務&#xff1a;將以前完成的所有的腳本統一改寫為unitest框架方式 1、需求原型 1.1 框架目錄結構 V1.0&#xff1a;一般的設計思路分為配置層、腳本層、數據層、結果層&#xff0c;如下圖所示 V 2.0&#xff1a;加入驅動層testdriver 1.2 框架各層需要完成的工作 1、配…

Fast DDS library windows 下源碼編譯(cmake)

目錄 編譯環境&#xff1a; 編譯需要的源碼文件&#xff1a; Fast DDS編譯&#xff1a; 注意事項&#xff1a; 參考文檔&#xff1a; 基于Fast DDS 的源碼來編譯相關的庫&#xff0c;然后可以通過python 來調用庫文件實現dds 數據通信&#xff0c;本文就詳細的介紹編譯過程…

機器學習筑基篇,容器調用顯卡計算資源,Ubuntu 24.04 快速安裝 NVIDIA Container Toolkit!...

[ 知識是人生的燈塔,只有不斷學習,才能照亮前行的道路 ] Ubuntu 24.04 安裝 NVIDIA Container Toolkit 什么是 NVIDIA Container Toolkit? 描述:NVIDIA Container Toolkit(容器工具包)使用戶能夠構建和運行 GPU 加速的容器,該工具包括一個容器運行時庫和實用程序,用于自動…

石油巨頭受沖擊!埃克森美孚、BP接連發出盈利預警

KlipC報道&#xff1a;近日&#xff0c;BP&#xff08;英國石油&#xff09;預計其第二季度將面臨10億至20億美元的減值費用&#xff0c;并發出警告稱其煉油利潤率“大幅下降”&#xff0c;石油交易收益預計出現疲軟。消息公布后&#xff0c;其股價下跌超4%。 由于中間餾分油利…

JavaScript(8)——函數

函數 function,是被設計執行特定任務的代碼塊。 函數可以把具有相同或相似邏輯的代碼包裹起來&#xff0c;通過函數調用執行這些代碼&#xff0c;這么做的優勢有利于精簡代碼方便復用。類似于alert(),prompt()和console.log()&#xff0c;這些都是js函數&#xff0c;不過已經…

STL(一)

書寫形式&#xff1a;string (const string& str, size_t pos, size_t len npos); 舉例&#xff1a; int main(){ string url("https://mp.csdn.net/mp_blog/creation/editor?spm1000.2115.3001.4503") string sub1(url,0,5);//從下標為0開始向后5個字符&…

如何在 Python 中創建一個類似于 MS 計算器的 GUI 計算器

問題背景 假設我們需要創建一個類似于微軟計算器的 GUI 計算器。這個計算器應該具有以下功能&#xff1a; 能夠顯示第一個輸入的數字。當按下運算符時&#xff0c;輸入框仍顯示第一個數字。當按下第二個數字時&#xff0c;第一個數字被替換。 解決方案 為了解決這個問題&am…

華為OD機考題(HJ108 求最小公倍數)

前言 經過前期的數據結構和算法學習&#xff0c;開始以OD機考題作為練習題&#xff0c;繼續加強下熟練程度。 描述 正整數A和正整數B 的最小公倍數是指 能被A和B整除的最小的正整數值&#xff0c;設計一個算法&#xff0c;求輸入A和B的最小公倍數。 數據范圍&#xff1a;1≤…

Spring中的適配器模式和策略模式

1. 適配器模式的應用 1.1適配器模式&#xff08;Adapter Pattern&#xff09;的原始定義是&#xff1a;將一個類的接口轉換為客戶期望的另一個接口&#xff0c;適配器可以讓不兼容的兩個類一起協同工作。 1.2 AOP中的適配器模式 在Spring的AOP中&#xff0c;使用Advice&#…

【北京迅為】《i.MX8MM嵌入式Linux開發指南》-第一篇 嵌入式Linux入門篇-第十九章 Linux 工具之make 工具和 makefile 文件

i.MX8MM處理器采用了先進的14LPCFinFET工藝&#xff0c;提供更快的速度和更高的電源效率;四核Cortex-A53&#xff0c;單核Cortex-M4&#xff0c;多達五個內核 &#xff0c;主頻高達1.8GHz&#xff0c;2G DDR4內存、8G EMMC存儲。千兆工業級以太網、MIPI-DSI、USB HOST、WIFI/BT…

集群管理腳本

虛擬機集群管理腳本 文章目錄 虛擬機集群管理腳本一、遠程調用腳本(remote_call.sh)二、遠程復制目錄腳本(remote_copy.sh) 一、遠程調用腳本(remote_call.sh) 如果有傳命令參數&#xff0c;則執行該命令&#xff1b;如果沒有傳命令參數&#xff0c;則不執行。 #!/bin/bashcm…

【嵌入式Linux】<知識點> GDB調試(更新中)

文章目錄 前言 一、GDB調試預備工作 二、GDB的啟動與退出 三、GDB中查看源代碼 四、GDB斷點操作 五、GDB調試指令 前言 在專欄【嵌入式Linux】應用開發篇_Linux打工仔的博客中&#xff0c;我們已經寫了大量的源程序。但是在調試這些程序時我們都是通過printf大法和肉眼除…

評估指標:精確率(Precision)、召回率(Recall)、F1分數(F1 Score)

評估指標&#xff1a;精確率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、F1分數&#xff08;F1 Score&#xff09; 前言相關介紹1. 準確率&#xff08;Accuracy&#xff09;2. 精確率&#xff08;Precision&#xff09;3. 召回率&#xff08;Re…

Cadence23打開與關閉飛線,修改位號絲印大小

打開與關閉所有飛線&#xff1a; 顯示部分飛線&#xff1a; 單獨顯示網絡飛線尤為好用&#xff0c;點擊上圖中的網絡&#xff0c;之后鼠標點擊器件中你想高亮的網絡即可單獨打開部分飛線。 這里的關閉部分網絡的飛線也很好用&#xff0c;可以臨時關閉討厭的GND飛線&#xff1a…

掌握Postman的API請求模板:一鍵生成,效率倍增

&#x1f4d8; 掌握Postman的API請求模板&#xff1a;一鍵生成&#xff0c;效率倍增 Postman是API開發和測試的瑞士軍刀&#xff0c;而其請求模板功能更是提升工作效率的利器。API請求模板允許用戶定義一組可重用的請求配置&#xff0c;從而快速生成和發送API請求。本文將深入…

virturalBox+K8S部署jaeger-all-in-one

pod的yaml如下&#xff1a;這里使用的是主機host模式 apiVersion: apps/v1 kind: Deployment metadata:name: jaegerlabels:app: jaeger spec:replicas: 1selector:matchLabels:app: jaegertemplate:metadata:labels:app: jaegerspec:hostNetwork: truecontainers:- name: jae…