C++ 指針介紹

指針是C++編程語言中的一個強大且重要的特性。它允許程序員直接操作內存地址,從而提供了對低級別內存的訪問和控制。雖然指針在使用時可能比較復雜且容易出錯,但它們在提高程序效率和靈活性方面有著不可替代的作用。本文將介紹C++指針的基本概念、用法及其應用場景。

一、指針的基本概念

1.1 什么是指針?

指針是一個變量,其值為另一個變量的內存地址。通過指針,可以訪問和修改該地址指向的內存中的值。

int main() {int a = 10;int* p = &a;  // p是指向a的指針,存儲a的內存地址std::cout << "a: " << a << std::endl;std::cout << "Address of a: " << &a << std::endl;std::cout << "p: " << p << std::endl;std::cout << "Value at p: " << *p << std::endl;  // 使用*操作符訪問指針p指向的值return 0;
}

1.2 指針的聲明和初始化

  • 聲明指針:在變量類型后面加上*表示聲明一個指針變量。
  • 初始化指針:使用取地址符號&來獲取變量的內存地址,并賦值給指針。
int* p;  // 聲明一個指向int類型的指針p
int a = 10;
p = &a;  // 將a的地址賦值給指針p

1.3 指針的解引用

解引用(dereference)是通過指針訪問其指向的內存地址中的值。使用解引用操作符*可以實現解引用。

int a = 10;
int* p = &a;
int value = *p;  // 通過解引用操作符*獲取指針p指向的值

二、指針的常見用法

2.1 指針和數組

在C++中,數組名實際上是一個指向數組第一個元素的指針。因此,指針可以用于遍歷和操作數組。

int arr[] = {1, 2, 3, 4, 5};
int* p = arr;  // 數組名arr是一個指向數組第一個元素的指針for (int i = 0; i < 5; i++) {std::cout << *(p + i) << " ";  // 使用指針遍歷數組
}

2.2 指針和函數

指針可以作為函數參數,用于傳遞數組或實現指針引用調用。指針參數使得函數可以直接操作傳入的變量,而不是其副本。

void increment(int* p) {(*p)++;  // 解引用指針,并對其指向的值進行操作
}int main() {int a = 10;increment(&a);  // 傳遞變量a的地址std::cout << "a: " << a << std::endl;  // 輸出結果為11return 0;
}

2.3 指針和動態內存分配

在C++中,可以使用指針和動態內存分配函數(如newdelete)來管理動態內存。動態內存分配允許在運行時分配和釋放內存。

int* p = new int;  // 動態分配一個int類型的內存空間
*p = 10;  // 賦值
std::cout << "Value at p: " << *p << std::endl;
delete p;  // 釋放動態分配的內存

對于數組的動態分配和釋放:

int* arr = new int[5];  // 動態分配一個包含5個int類型元素的數組
for (int i = 0; i < 5; i++) {arr[i] = i + 1;
}
delete[] arr;  // 釋放動態分配的數組內存

三、指針的高級用法

3.1 指向指針的指針

C++允許指針指向另一個指針,這稱為指向指針的指針(pointer to pointer)。

int a = 10;
int* p = &a;
int** pp = &p;  // pp是一個指向指針p的指針std::cout << "Value at pp: " << **pp << std::endl;  // 通過兩次解引用訪問a的值

3.2 指針數組和數組指針

  • 指針數組:數組的每個元素都是一個指針。
int* arr[3];
int a = 1, b = 2, c = 3;
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;for (int i = 0; i < 3; i++) {std::cout << *arr[i] << " ";
}
  • 數組指針:指向數組的指針。
int arr[3] = {1, 2, 3};
int (*p)[3] = &arr;for (int i = 0; i < 3; i++) {std::cout << (*p)[i] << " ";
}

四、指針的注意事項

  1. 指針初始化:聲明指針時應盡量初始化,避免使用未初始化的指針。
  2. 指針運算:指針運算需要小心,避免訪問越界內存。
  3. 內存管理:使用動態內存分配時,應確保在使用new分配內存后使用delete釋放內存,避免內存泄漏。
  4. 空指針檢查:在使用指針前,應檢查指針是否為空,以避免訪問空指針引發錯誤。
int* p = nullptr;
if (p != nullptr) {// 安全使用指針p
}

五、總結

指針是C++中的重要概念,提供了對內存的直接操作能力。通過指針,可以實現高效的數組操作、動態內存分配和函數參數傳遞。盡管指針使用起來可能比較復雜且容易出錯,但掌握指針的使用對于編寫高效和靈活的C++代碼是必不可少的。

希望本文對您理解和使用C++指針有所幫助。如果您有任何疑問或建議,歡迎留言討論。

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

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

相關文章

Docker 中 MySQL 遷移策略(單節點)

目錄 一、 簡介二、操作流程2.1 進入mysql容器2.2 導出 MySQL 數據2.3. 將導出的文件復制到宿主機2.4 創建 Docker Compose 配置2.5 啟動新的 Docker 容器2.6 導入數據到新的容器2.7 驗證數據2.8 刪除舊的容器&#xff08;刪除操作需慎重&#xff09; 三、推薦配置四、寫在后面…

當年很多跑到美加澳寫代碼的人現在又移回香港?什么原因?

當年很多跑到美加澳寫代碼的人現在又移回香港&#xff1f;什么原因&#xff1f; 近年來&#xff0c;確實有部分曾經移民到美國、加拿大、澳大利亞等地的香港居民選擇移回香港。這一現象與多種因素相關&#xff0c;主要可以歸結為以下幾點&#xff1a; 疫情后的環境變化&#…

【STM32】溫濕度采集與OLED顯示

一、任務要求 1. 學習I2C總線通信協議&#xff0c;使用STM32F103完成基于I2C協議的AHT20溫濕度傳感器的數據采集&#xff0c;并將采集的溫度-濕度值通過串口輸出。 任務要求&#xff1a; 1&#xff09;解釋什么是“軟件I2C”和“硬件I2C”&#xff1f;&#xff08;閱讀野火配…

2025第13屆常州國際工業裝備博覽會招商全面啟動

常州智造 裝備中國|2025第13屆常州國際工業裝備博覽會招商全面啟動 2025第13屆常州國際工業裝備博覽會將于2025年4月11-13日在常州西太湖國際博覽中心盛大舉行&#xff01;目前&#xff0c;各項籌備工作正穩步推進。 60000平米的超大規模、800多家國內外工業裝備制造名企將云集…

C++中的RAII(資源獲取即初始化)原則

C中的RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;資源獲取即初始化&#xff09;原則是一種管理資源、避免資源泄漏的慣用法。RAII是C之父Bjarne Stroustrup提出的設計理念&#xff0c;其核心思想是將資源的獲取&#xff08;如動態內存分配、文件句柄、…

最細最有條理解析:事件循環(消息循環)是什么?進程與線程的定義、關系與差異

目錄 事件循環&#xff1a;引入 一、瀏覽器的進程模型 1.1、什么是進程&#xff08;Process&#xff09; 1.2、什么是線程&#xff08;Thread&#xff09; 1.3、進程與線程之間的關系聯系與區別 二、瀏覽器有哪些進程和線程 2.1、瀏覽器的主要進程 ①瀏覽器進程 ②網絡…

ctfshow sqli-libs web561--web568

web561 ?id-1 or 1--?id-1 union select 1,2,3--?id-1 union select 1,(select group_concat(column_name) from information_schema.columns where table_nameflags),3-- Your Username is : id,flag4s?id-1 union select 1,(select group_concat(flag4s) from ctfshow.f…

擴展學習|風險評估和風險管理:回顧其基礎上的最新進展

文獻來源&#xff1a;[1]Aven, T. (2016). Risk assessment and risk management: Review of recent advances on their foundation. European journal of operational research, 253(1), 1-13. 文章簡介&#xff1a;大約30-40年前&#xff0c;風險評估和管理被確立為一個科學領…

數據結構 - C/C++ - 鏈表

目錄 結構特性 內存布局 結構樣式 結構拓展 單鏈表 結構定義 節點關聯 插入節點 刪除節點 常見操作 雙鏈表 環鏈表 結構容器 結構設計 結構特性 線性結構的存儲方式 順序存儲 - 數組 鏈式存儲 - 鏈表 線性結構的鏈式存儲是通過任意的存儲單元來存儲線性…

技術分享:分布式數據庫DNS服務器的架構思路

DNS是企業數字化轉型的基石。伴隨微服務或單元化部署的推廣&#xff0c;許多用戶也開始采用分布式數據庫將原來的單體數據庫集群服務架構拆分為大量分布式子服務集群&#xff0c;對應不同的微服務或服務單元。本文將從分布式數據庫DNS服務器的架構需求、架構分析兩方面入手&…

1_插入排序_循環不變式

01_插入排序 #include<stdio.h>void insert_sort(int arr[], int n); void printArray(int arr[], size);int main() {int arr[] {1, 2, 3, 22, 5, 9};int n sizeof(arr) / sizeof(arr[0]);printf("打印原始數組:\n");prinfArray(arr, n);insert_sort(arr, …

湖北大學2024年成人高考函授報名專升本市場營銷專業介紹

在璀璨的學術殿堂中&#xff0c;湖北大學如同一顆璀璨的明珠&#xff0c;熠熠生輝。為了滿足廣大社會人士對于繼續深造、提升自我、實現職業夢想的渴望&#xff0c;湖北大學特別開設了成人高等繼續教育項目&#xff0c;為廣大有志之士敞開了一扇通往知識殿堂的大門。 而今&…

【FFmpeg】av_write_frame函數

目錄 1.av_write_frame1.1 寫入pkt&#xff08;write_packets_common&#xff09;1.1.1 檢查pkt的信息&#xff08;check_packet&#xff09;1.1.2 準備輸入的pkt&#xff08;prepare_input_packet&#xff09;1.1.3 檢查碼流&#xff08;check_bitstream&#xff09;1.1.4 寫入…

【創建者模式-建造者模式】

概要 將一個復雜對象的構建與表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示。 建造者模式包含以下角色 抽象建造者類&#xff08;Builder&#xff09;&#xff1a;這個接口規定要實現復雜對象的那些部分的創建&#xff0c;并不涉及具體的部件對象的創建。具體建…

什么是ISR?

ISR&#xff08;Interrupt Service Routine&#xff0c;中斷服務程序&#xff09;是一個用于處理硬件中斷的特定程序。中斷是硬件或軟件引起的事件&#xff0c;會暫時打斷當前正在運行的任務&#xff0c;以便緊急處理某個事件。ISR的目的是快速響應中斷信號&#xff0c;執行所需…

在WSL Ubuntu中啟用root用戶的SSH服務

在 Ubuntu 中&#xff0c;默認情況下 root 用戶是禁用 SSH 登錄的&#xff0c;這是為了增加系統安全性。 一、修改配置 找到 PermitRootLogin 行&#xff1a;在文件中找到 PermitRootLogin 配置項。默認情況下&#xff0c;它通常被設置為 PermitRootLogin prohibit-password 或…

一篇文章學會【node.js安裝以及Vue-Cli腳手架搭建】

一.為什么搭建Vue-Cli (1).傳統的前端項目結構&#xff1a; 一個項目中有許多html文件&#xff0c;每一個html文件都是相互獨立的&#xff0c; 如果需要在頁面中導入一些外部依賴的組件&#xff0c;就需要在每一個html文件中都需要導入&#xff0c;非常麻煩 (2).現在的前端…

A股低開高走,近3000點,行情要啟動了嗎?

A股低開高走&#xff0c;近3000點&#xff0c;行情要啟動了嗎&#xff1f; 今天的A股&#xff0c;讓人瞪目結舌了&#xff0c;你們知道是為什么嗎&#xff1f;盤面上出現2個重要信號&#xff0c;一起來看看&#xff1a; 1、今天兩市低開高走&#xff0c;銀行板塊護盤指數&…

Windows 下后臺啟動java項目的 jar 包

java -jar swagger.jar 的dos窗口 后臺啟動 jar 包&#xff1a; 使用 javaw.exe 啟動 jar 包&#xff0c;并不會在窗口打印日志&#xff0c;而且會直接在后臺運行進程&#xff0c;關掉窗口&#xff0c;進程繼續跑 javaw -jar swagger.jar 關閉進程&#xff1a; 后臺啟動的 …

大數據面試題之Spark(7)

Spark實現wordcount Spark Streaming怎么實現數據持久化保存? Spark SQL讀取文件&#xff0c;內存不夠使用&#xff0c;如何處理? Spark的lazy體現在哪里? Spark中的并行度等于什么 Spark運行時并行度的設署 Spark SQL的數據傾斜 Spark的exactly-once Spark的RDD和p…