C++二級指針的用法指向指針的指針(多級間接尋址)

????????指向指針的指針是一種多級間接尋址的形式,或者說是一個指針鏈。

????????指針的指針就是將指針的地址存放在另一個指針里面。

????????通常,一個指針包含一個變量的地址。當我們定義一個指向指針的指針時,第一個指針包含了第二個指針的地址,第二個指針指向包含實際值的位置。????????

???????一個指向指針的指針變量必須如下聲明,即在變量名前放置兩個星號。例如,下面聲明了一個指向 int 類型指針的指針:

int **var;

??????????當一個目標值被一個指針間接指向到另一個指針時,訪問這個值需要使用兩個星號運算符,如下面實例所示:

#include <iostream>using namespace std;int main ()
{int  var;int  *ptr;int  **pptr;var = 3000;// 獲取 var 的地址ptr = &var;// 使用運算符 & 獲取 ptr 的地址pptr = &ptr;// 使用 pptr 獲取值cout << "var 值為 :" << var << endl;cout << "*ptr 值為:" << *ptr << endl;cout << "**pptr 值為:" << **pptr << endl;return 0;
}

當上面的代碼被編譯和執行時,它會產生下列結果:

var 值為 :3000
*ptr 值為:3000
**pptr 值為:3000

在?C++?程序中,指針可以指向基本數據類型,如整型或字符型,從而允許我們訪問這些數據。由于指針本身也是存儲在內存中的變量,它記錄著數據的內存地址,因此指針也可以指向另一個指針,即指向指針的指針。

????????雖然這個概念初聽起來有些復雜,但可以這樣理解,指針本質上是一個存儲內存地址的變量,當有一個指針變量存儲了另一個指針變量所在內存的地址時,我們就稱這個指針為“指向指針的指針”,又稱為二級指針。

為了更清晰地展示這一概念,下面是一個實際的例子:

int N = 2;
int* pN = &N;     // 定義一個指針變量pN,記錄變量N所在的內存地址
int** ppN = &pN;  // 定義一個指針變量ppN,記錄指針變量pN所在的內存地址

????????在這段代碼中,首先定義了一個整型變量 N,然后定義了一個整型指針指向這個變量 N。換句話說,這個指針的值就是整型變量 N 在內存中的地址。最后,指向指針的指針 ppN 登場了,我們用?int**?作為數據類型定義了一個指針 ppN,其中保存的就是 pN 指針變量所在內存中的地址,也就是它指向這個整型指針 pN。

????????下圖展示了這三個變量之間的關系

圖 1 指向指針的指針

????????從圖 1 中可以看到,變量 N 保存在內存地址 0016FA38 這個位置,而指針變量 pN 記錄的值是 N 所在的內存位置 0016FA38,同時它自己保存在內存地址 0016FA5C 這個位置。

????????同理,作為指向 pN 的指針,ppN 這個指針變量記錄的值是 pN 所在內存地址 0016FA5C 的位置,而它自己保存在內存地址 0016FA90 這個位置。

????????簡單來講,普通指針指向的是一個具體的數據,而指針的指針指向的是一個指針數據,我們可以把指針數據也當作某個具體的數據,它也有自己的數據類型(例如 int*),也占用一定的內存(例如 0016FA5C),記錄一定的數值(例如 0016FA37)。類比普通數據,指向指針的指針的數據類型,就是在它所指向的數據的類型之后加一個“*”。

????????例如,我們要定義一個指針指向另一個?int*?類型的指針,那么它自身的類型就是 int* 加一個“*”就成了?int**。而這個指針的值,同樣是用“&”取得被指向的指針變量的地址賦給它,于是它就成為指向這個指針的指針。

????????在 C++ 中,可以用下面的語法格式來定義一個二級指針:

數據類型** 指針變量名

其中,數據類型表示它所指向的指針的數據類型。例如:

  • int** ppN = &pN;

    ????????這樣就定義了一個指向整型指針的二級指針 ppN,它指向另一個指針變量 pN,而 pN 指針變量又指向一個整型變量。

    ????????二級指針通常用來訪問指針數組。數組不僅可以保存基本數據類型的數據,還可以保存指針,保存指針的數組被稱為指針數組。如果要訪問一個指針數組,使用二級指針最為方便。

// 這是一個指針數組,其中保存的是各個字符串常量的首地址指針,其類型是 const char*
const char* arrMonth[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};// 定義一個指向指針的指針
// 因為要指向的指針是 const char*類型,所以加上*后它自身的類型就是 const char**
// 這里數組的首地址 arrMonth 就是數組的第一個元素
// 也就是指向第一個字符串 “Jan” 的指針
const char** pMonth = arrMonth;// 獲取用戶輸入
int nIndex = 0;
cout << "請輸入月份對應的數字: " << endl;
cin >> nIndex;
// 對指針進行運算,使其指向相應的數組元素
// 也就是相應的字符串指針
const char* pCurMonth = *(pMonth + (nIndex - 1));
cout << "對應的月份是: " << pCurMonth << endl;

????????在以上這段代碼中,arrMonth 數組中保存的是多個字符串常量的指針,這些指針的數據類型是?const char*

????????為了利用指針偏移方便地訪問數組中的各個字符串,我們需要一個可以指向這些字符串元素的指針,因為字符串元素的類型是?const char*,所以我們定義了一個?const char**?類型的二級指針 pMonth,并將字符串數組的首地址賦值給它,使其指向字符串數組的第一個元素。然后通過對 pMonth 進行運算,讓其偏移指向數組中所對應的字符串元素。

????????指針運算后得到的仍然是指針,我們需要用“*”符號取得這個指針所指向的內容,才能得到對應的字符串指針,直接輸出就可以得到數字對應的月份字符串

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

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

相關文章

【格與代數系統】示例

【格與代數系統】格與代數系統匯總 例1 設是由誘導的代數系統&#xff0c;則其上的二元運算滿足&#xff08;ABCD&#xff09; A. B. C. D. 代數系統滿足交換律、冪等律、吸收律、結合律 例2 是&#xff08;ABCD&#xff09; A.有界格 有界格&#xff1a;有最大、最小元…

Stable Diffusion 項目實戰落地:手機壁紙制作-第一篇 從零基礎到生成藝術品的第一步!

大家好!歡迎來到《StableDiffusion實戰-手機壁紙制作》系列的第一篇! 在這一篇文章里,我們將一起探索如何用StableDiffusion(SD)這款強大的工具,快速制作出炫酷的手機壁紙。 如果你對生成藝術、AI繪圖感興趣,那你一定不能錯過! 你能做什么?你將做什么! 在之前的系…

WEB3開啟 Hardhat 自動驗證有什么意義

這是個非常好的問題&#xff0c;尤其是你在學習 Web3 后端開發時&#xff0c;理解為什么要啟用 Hardhat 自動驗證合約源碼&#xff0c;會讓你開發流程更完整、更專業。 ? 一句話總結&#xff1a; 開啟 Hardhat 自動驗證的意義是&#xff1a;讓你的合約在區塊鏈瀏覽器&#xff…

Qt窗?的學習(一)

Qt窗?是通過QMainWindow類來實現的。 QMainWindow是?個為??提供主窗?程序的類&#xff0c;繼承?QWidget類&#xff0c;并且提供了?個預定義的 布局。QMainWindow包含?個菜單欄&#xff08;menubar&#xff09;、多個?具欄(toolbars)、多個浮動窗?&#xff08;鉚 接部…

C++ 面試題常用總結 詳解(滿足c++ 崗位必備,不定時更新)

&#x1f4da; 本文主要總結了一些常見的C面試題&#xff0c;主要涉及到語法基礎、STL標準庫、內存相關、類相關和其他輔助技能&#xff0c;掌握這些內容&#xff0c;基本上就滿足C的崗位技能&#xff08;紅色標記為重點內容&#xff09;&#xff0c;歡迎大家前來學習指正&…

git提交的腳本無執行權限怎么辦

問題描述 自己寫的小項目&#xff0c;沒有在服務器安裝 Jenkins 進行項目部署&#xff0c;為了圖方便&#xff0c;在項目中編寫了一個 deploy.sh 腳本文件用來執行項目部署。但是在服務器上 pull 下來之后發現腳本文件沒有執行權限&#xff0c;通過 chmod 命令進行賦權&#x…

004.chromium編譯進階-啟動時傳入cookies

一、目標&#xff1a; 實現傳入參數--set-cookies[{"domain":"https://baidu.com","name":"AAAA","value":"111"},{"domain":"https://baidu.com","name":"BBB","…

【數據庫復習】

數據庫復習題 一、填空題1&#xff0e;數據庫系統一般由&#xff08;數據庫&#xff09;、應用系統、&#xff08;數據庫管理系統&#xff09;、&#xff08;數據庫管理員&#xff09;和用戶構成。2&#xff0e;數據模型通常由&#xff08;數據結構&#xff09;、&#xff08;數…

微信小程序:選擇頁面單選實現(多頁面均可選擇)

一、效果展示 1、主頁面 展示了兩個選擇行 2、選擇頁面 根據傳遞的參數決定員工展示的數據,并且單選,可將數據傳遞給主頁面 二、主頁面實現 1、視圖層 寫入了采購員和庫管員的行選擇信息 <view class="item flex flex-between"><view class="i…

使用docker-compose搭建redis-cluster集群

前言 如果你也因為centos的gcc版本落后導致redis編譯安裝不通過而煩惱&#xff0c;大可以試一試用docker去搭建redis集群。本文以單節點搭建redis-cluster三主三從為例。 ip&#xff1a;192.168.0.10redis信息&#xff1a; 客戶端連接端口&#xff1a;7001 -7006集群間通信端…

【LLaMA-Factory 實戰系列】二、WebUI 篇 - Qwen2.5-VL 多模態模型 LoRA 微調保姆級教程

【LLaMA-Factory 實戰系列】二、WebUI 篇 - Qwen2.5-VL 多模態模型 LoRA 微調保姆級教程 1. 引言1.1 為什么選擇 Qwen2.5-VL-3B-Instruct&#xff1f;1.2 環境要求 2. 環境搭建2.1 安裝 LLaMA-Factory2.2 驗證安裝 3. 數據集準備與配置3.1 數據集結構3.2 數據格式3.3 數據集聲明…

風險矩陣與灰色綜合評價

一、風險矩陣&#xff08;Risk Matrix&#xff09; 1. 定義與原理 定義&#xff1a;風險矩陣是一種通過二維網格&#xff08;可能性 vs. 后果嚴重程度&#xff09;可視化展示風險等級的工具&#xff0c;用于優先級排序和決策支持。核心要素&#xff1a; 橫軸&#xff08;X軸&…

谷歌瀏覽器電腦版官方下載- Google Chrome官方網頁版入口

谷歌瀏覽器&#xff08;Google Chrome&#xff09;是一款由谷歌公司開發的免費網頁瀏覽器&#xff0c;自2008年首次發布以來&#xff0c;迅速成為全球最受歡迎的瀏覽器之一。它以簡潔的界面設計、快速的瀏覽速度和強大的安全性能而聞名。谷歌瀏覽器支持多種操作系統&#xff0c…

垂直電商供應鏈平臺:重構產業生態,驅動數字化增長

垂直電商供應鏈平臺&#xff1a;重構產業生態&#xff0c;驅動數字化增長 在電商行業競爭日益激烈的當下&#xff0c;垂直電商供應鏈平臺憑借對細分領域的深度聚焦與數字化能力&#xff0c;成為產業升級的關鍵引擎。本文圍繞垂直電商供應鏈平臺的架構、價值及生態構建展開&…

VSCode 插件 Remote - SSH:開啟高效遠程開發之旅

在當今的軟件開發領域&#xff0c;遠程開發已經成為了一種越來越流行的工作方式。無論是分布式團隊協作&#xff0c;還是需要在不同環境中進行開發&#xff0c;遠程開發都能為開發者帶來極大的便利。而 VSCode 的 Remote - SSH 插件&#xff0c;就是一款能夠幫助開發者實現高效…

亞矩陣云手機+Whatnot:直播電商的自動化增長引擎

在直播電商蓬勃發展的今天&#xff0c;Whatnot作為北美領先的收藏品和潮流商品拍賣平臺&#xff0c;吸引了大量賣家和收藏愛好者。然而&#xff0c;高效運營多個賬號、管理直播場次、優化出價策略等挑戰&#xff0c;讓許多商家難以規模化經營。??亞矩陣云手機??與??Whatn…

關于vue.mixin與vue.use的用法分析

背景。源碼不會讀&#xff0c;不清楚的問大模型。特別是對平常開發太會用到的情形。 vue.mixin。是將每一個頁面注入mixin的內容。會對頁面中注入$uStore而不是方便獲取狀態信息。 vue.use。按裝的插件。用于封裝完整的功能&#xff0c;如UI庫&#xff0c;路由攔截器等&…

MySQL 8.x配置MGR高可用+ProxySQL讀寫分離(二):ProxySQL配置MySQL代理及讀寫分離

#作者&#xff1a;stackofumbrella 文章目錄 ProxySQL簡介ProxySQL架構ProxySQL的安裝與配置在不同層次間移動配置 ProxySQL簡介 ProxySQL是基于MySQL的一款開源的中間件的產品&#xff0c;是一個靈活的MySQL代理層&#xff0c;可以實現讀寫分離&#xff0c;支持Query路由功能…

基于 Python Flask 的 B/S 架構項目的軟件設計思路

文章目錄 基于 Python Flask 的 B/S 架構項目的軟件設計思路1. 引言2. B/S架構概述2.1 什么是B/S架構2.2 B/S架構的組成層次2.3 B/S vs C/S架構對比2.4 現代B/S架構的發展趨勢 3. Flask在B/S架構中的定位3.1 Flask作為B/S架構的后端框架3.2 Flask的架構優勢3.3 Flask在不同B/S架…

AntV F2入門教程

以下教程將系統地介紹 AntV?F2&#xff08;移動端可視化引擎&#xff09;的核心 組件 API&#xff0c;包含安裝與引入、畫布與圖表、數據映射、幾何標記、坐標軸、圖例、提示、標注和滾動條等&#xff0c;每個 API 都附帶完整示例代碼&#xff0c;幫助你快速掌握 F2 用法。 一…