網站首頁 編程語言 正文
1 What
指針,是 C/C++ 編程語言中的一個重要概念。指針通常可以理解為內存地址,而指針變量就是用來存放內存地址的變量。在同一 CPU 架構下,不同類型的指針變量所占用的存儲單元的長度是相同的(而存放數據的變量因數據類型的不同,所占用的存儲空間長度也不同)。例如,在 64 位操作系統(安裝在 X64 CPU 架構之上)中,指針變量占用 8 字節。通過使用指針,不僅可以對數據本身進行操作,也可以對存儲該數據的變量地址進行操作。
在 C/C++ 編程語言中,指針變量存儲的是其指向的對象的首地址,指針指向的對象可以是變量(注意,指針變量也是變量)、數組、函數、對象等占據存儲空間的實體。
下面通過一個簡單的指針及其指向對象的信息關系圖來進一步介紹指針。現假設有一個字符變量“c”,其內容為“A”,又有一個名稱為“pChar”的指針(變量)指向該字符變量,因此字符變量“c”與指向其的指針“pChar”關系如下圖所示:
?通過上圖內容,可知:
- 字符變量“c”的內存地址為“0x7ffefdc3ae00”;
- 指針變量“pChar”指向的字符變量“c”對應的內存地址為“0x7ffefdc3ae00”,因此,指針變量的內容即為“0x7ffefdc3ae00”,從這里就可以知道,指針變量與其他變量不同,其存儲的內容是內存地址(而其他變量通常存儲用戶數據);
- 指針變量也是一種變量,其也是存儲在內存空間中的,在上圖中未將指針變量畫在內存空間中是為了便于觀察指針變量及其指向對象之間的關系。
2 用法示例
在本章中,將通過示例代碼來介紹 C/C++ 編程語言中指針的具體用法。
2.1 示例
示例1的代碼內容如下:
#includeusing namespace std; int main() { char c = 'A'; cout << "c is: " << c << endl; cout << "address of c is: " << (void*)&c << endl << endl; char* pChar1 = &c; cout << "*pChar1 is: " << *pChar1 << endl; cout << "pChar1 is: " << (void*)pChar1 << endl; cout << "address of pChar1 is: " << &pChar1 << endl << endl; char* pChar2 = pChar1; cout << "*pChar2 is: " << *pChar2 << endl; cout << "pChar2 is: " << (void*)pChar2 << endl; cout << "address of pChar2 is: " << &pChar2 << endl << endl; char** pChar3 = &pChar2; cout << "**pChar3 is: " << **pChar3 << endl; cout << "*pChar3 is: " << (void*)(*pChar3) << endl; cout << "pChar3 is: " << (void*)pChar3 << endl; cout << "address of pChar3 is: " << &pChar3 << endl << endl; return 0; }
編譯并執行上述代碼,(可能的)結果如下:
通過上述代碼及其執行結果,可知:
- 在 C/C++ 編程語言中,通過取地址運算符“&”可以獲取到變量的內存地址;
- 指向一般變量(如本例中的字符變量 c)的指針變量(如本例中的 pChar1 和 pChar2),為一級指針,而指向一級指針的指針變量(如本例中的指針變量 pChar3),為二級指針,依此類推;
- 對指針變量進行賦值操作,需要滿足指針級別的對應關系,如一級指針賦值給一級指針、二級指針賦值給二級指針,否則編譯器會報錯;
- 通過指針操作符“*”可以獲取指針變量指向的對象的內容,如本例中通過“*pChar1”可獲取指針變量 pChar1 指向的字符變量 c 的內容;
- 對于二級指針,使用一個指針操作符“*”獲取到的是該指針指向的指針變量的內容,使用兩個指針操作符“*”才能獲取到該指針變量指向的指針變量指向的對象的內容——有點繞,具體看代碼及運行結果:)
- 在 C++ 編程語言中,可通過將內存地址強轉為 void* 類型的方式,來打印其內容;
本例的指針及其指向的對象的相關信息,如下圖所示:
總結
原文鏈接:https://blog.csdn.net/liitdar/article/details/123153943
- 上一篇:C語言程序環境中的預處理詳解_C 語言
- 下一篇:C語言實現考勤管理系統_C 語言
相關推薦
- 2022-11-25 ASP.NET?MVC使用異步Action的方法_實用技巧
- 2022-10-05 python?matplotlib自定義colorbar顏色條及內置色條詳解_python
- 2023-06-04 Django修改端口號與地址的三種方式_python
- 2022-03-24 Android實現旋轉動畫_Android
- 2022-10-10 YOLOv5改進之添加SE注意力機制的詳細過程_python
- 2022-10-22 Python中的Unittest基本使用_python
- 2022-08-10 Github簡單易用的?Android?ViewModel?Retrofit框架_Android
- 2022-05-20 flume的負載均衡load balancer
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支