突破編程_C++_面試(指針(1))

面試題 1 :什么是空指針?

在 C++ 中,空指針是一個特殊的指針值,它不指向任何有效的內存地址。空指針通常用于表示指針不指向任何對象或函數。在C++11及以后的版本中, nullptr 是表示空指針的推薦方式。
nullptr 是一個指針類型的字面量,它不能轉換為整數類型,也不能被解引用。這使得 nullptr 在類型安全性和語義上比傳統的 NULL 或 0 更有優勢。
以下是一些關于空指針的要點:
(1)定義:在 C++11 及以后的版本中, nullptr 是一個關鍵字,用于表示空指針。
(2)類型安全: nullptr 是一個指針類型的字面量,因此它不能隱式地轉換為整數。這有助于防止一些由于類型不匹配導致的錯誤。
(3)比較: nullptr 可以與任何指針類型進行比較,包括 void* 指針。比較的結果將是 true ,如果指針是空指針;否則是 false 。
(4)解引用:嘗試解引用 nullptr (即嘗試訪問 nullptr 所指向的內存地址)將導致程序崩潰或未定義行為。
(5)初始化:可以將指針變量初始化為 nullptr ,以表示它不指向任何對象。
(6)與 NULL 的區別:在 C++11 及以后的版本中, NULL 通常被定義為 0 或 (void*)0 ,它是一個整數值,可以隱式地轉換為任何指針類型。然而,由于 NULL 可以隱式地轉換為整數,這可能導致一些類型相關的錯誤。因此,在現代C++編程中,推薦使用 nullptr 代替 NULL 。
下面是一個使用 nullptr 的例子:

int* ptr = nullptr;  // 指針ptr1被初始化為空指針
if (nullptr == ptr) 
{// ptr1是空指針,執行這里的代碼
}// 下面的代碼將導致未定義行為,因為不能解引用空指針
// int value = *ptr;

在實際編程中,當函數返回一個指針,而該指針可能不指向任何有效對象時,通常使用 nullptr 來表示這種情況。同樣,當函數的參數是一個指針,并且該參數可能不被使用時,可以將其傳遞為 nullptr 。

面試題 2 :什么是懸垂指針?

懸垂指針是指向已經被釋放或收回的內存地址的指針。當所指向的對象被釋放或收回,但對該指針沒有作任何的修改,以至于該指針仍舊指向已經回收的內存地址,此情況下該指針便稱為懸垂指針。懸垂指針往往導致程序錯誤,而且難以檢測。若操作系統將這部分已經釋放的內存重新分配給另外一個進程,而原來的程序重新引用現在的懸垂指針,則將產生無法預料的后果,因為這些內存現在包含的可能已經是完全不同的數據。懸垂指針通常是由于不正確的內存管理造成的,比如當使用 new 分配內存后,如果忘記使用 delete 釋放內存,或者釋放了內存后仍然保留原來的指針,就可能導致懸垂指針的產生。
為了避免懸垂指針,可以采取以下一些措施:
(1)使用智能指針( std::unique_ptr 或 std::shared_ptr ),這些智能指針在超出作用域或重新賦值時會自動釋放內存。
(2)在釋放內存后將指針設為 nullptr ,這樣可以明確地表示指針不再指向任何有效的內存地址。
(3)避免返回局部變量的地址或引用,因為局部變量在函數返回后會被銷毀,其地址可能不再有效。
(4)在編寫涉及指針操作的代碼時,要特別小心,確保所有的內存分配和釋放都是正確和匹配的。
注意:懸垂指針和野指針有所不同。野指針是指從未被初始化或從未指向有效對象的指針,而懸垂指針則是曾經有效但現在失效的指針。

面試題 3 :如何理解指針的加減運算?

指針的加減運算在 C++ 中是一種重要的操作,它允許程序員直接操作內存地址。這種運算實際上是對指針所指向的內存地址進行算術運算,從而改變指針的指向。
具體來說,指針的加法運算通常是將指針向后(或向前)移動一定的內存單元數。例如,如果一個指針 p 指向數組的第 n 個元素,那么 p+1 就會指向第 n+1 個元素。這里的 1 并不表示具體的元素數量,而是表示指針 p 的類型所占用的字節數。例如,如果 p 是一個整型指針(在大多數系統上,整型占用 4 個字節),那么 p+1 就會跳過 4 個字節,指向下一個整型元素。
指針的減法運算也是類似的,它會根據指針的類型計算出兩個指針之間的內存單元數量。例如,如果 p 和 q 是兩個指針,那么 p-q 就會計算出 p 和 q 之間相隔的內存單元數,也就是 p 所指向的內存地址與 q 所指向的內存地址之間的差值,除以 p 的類型所占用的字節數。
需要注意的是,指針的加減運算只能在具有相同類型的指針之間進行,否則會導致編譯錯誤。此外,對指針進行加減運算時,必須確保結果指針仍然指向有效的內存地址,否則可能會導致程序崩潰或未定義行為。
如下為樣例代碼:

#include <iostream>  int main() 
{int vals[] = { 1, 2, 3, 4, 5 }; // 一個包含5個整數的數組  int *ptr = vals;	 // 定義一個指向數組首元素的指針p  // 使用指針加減運算遍歷數組  for (int i = 0; i < 5; i++){std::cout << "vals[" << i << "] = " << *ptr << std::endl;		// 輸出當前指針指向的元素值  ptr++;		// 指針向后移動一個整型元素的位置(即移動 4 個字節,假設整型大小為 4 字節)  }// 現在用減法運算來將指針移回數組的開始位置  ptr = vals;		// 重置指針到數組開始位置  // 使用指針減法運算計算數組末尾元素的地址與數組首元素地址的差值  int offset = (vals + 5) - ptr; // 計算從數組首元素到末尾元素的指針差值  std::cout << "offset between end and start of array: " << offset << std::endl;return 0;
}

上面代碼的輸出為:

vals[0] = 1
vals[1] = 2
vals[2] = 3
vals[3] = 4
vals[4] = 5
offset between end and start of array: 5

在上面代碼中,首先定義了一個指向整型數組 vals 首元素的指針 ptr 。然后通過一個循環,每次將指針 ptr 向后移動一個整型元素的位置(通過 ptr++ ),并輸出當前指針所指向的元素值。這就是指針加法運算的應用。
在循環結束后,重置指針 ptr 到數組的開始位置,然后使用指針減法運算計算從數組首元素到末尾元素的指針差值。注意這里的差值并不是數組元素的數量,而是內存地址的差值,這個差值會被解釋成以指針類型大小(在這里是整型的大小)為單位的數量。

面試題 4 :什么是指針的數組?它與數組的指針有什么區別?

指針的數組和數組的指針是 C++ 語言中的兩種不同概念,它們在定義和使用上有顯著的區別。
指針的數組
(1)指針的數組是一個數組,其中每個元素都是一個指針。換句話說,它存儲了多個指針的地址,這些指針可以指向不同類型的數據或對象。
(2)聲明方式為 type *array[],其中 type 為指針指向的數據類型。例如,int *ptrArray[5] 表示一個包含5個指向整數類型數據的指針的數組。
(3)在指針數組中,每個元素(即每個指針)都可以單獨指向不同的內存空間,因此它可以用于存儲不同類型或不同位置的數據,提供了更大的靈活性。
數組的指針
(1)數組的指針是一個指針,它指向一個數組的首地址。也就是說,它存放的是一個數組的首地址。
(2)聲明方式為 type (*ptr)[size],其中 type 為數組中元素的數據類型,size 為數組的大小。例如,int (*ptr)[5] 表示一個指向包含5個整數類型元素的數組的指針。
(3)數組指針解析出來的是整個數組,因此可以通過該指針遍歷并訪問數組的所有元素。數組指針通常用于處理多維數組。

區別
(1)本質:指針的數組本質上是一個數組,而數組的指針本質上是一個指針。
(2)用途:指針的數組通常用于存儲指向不同類型或不同位置的數據的指針,而數組的指針用于訪問和操作整個數組。
(3)聲明方式:指針的數組聲明時,* 緊跟在類型后面;而數組的指針聲明時,* 緊跟在變量名前面,并用括號 () 將 * 和變量名括起來。
(4)靈活性:指針的數組更加靈活,因為它允許存儲指向不同類型數據的指針;而數組的指針則更專注于對整個數組的操作。

面試題 5 :什么是函數指針?如何使用它?

函數指針是一個指針變量,它存儲了函數的內存地址,因此可以通過該指針變量來調用函數。函數指針的聲明方法一般為:返回值類型 (*指針變量名)([形參列表])。
使用函數指針的基本步驟如下:
(1)定義函數指針類型:首先,需要定義一個函數指針類型,這通常是通過定義一個指向特定類型函數的指針變量來實現的。例如,如果有一個返回 int 類型并接受兩個 int 類型參數的函數,可以這樣定義函數指針類型: int (*func)(int, int) ;
(2)初始化函數指針:然后,可以將一個函數的地址賦值給這個指針。這通常是通過將函數名(不帶括號)賦值給指針變量來實現的。例如,如果有一個名為 myFunc 的函數,可以這樣初始化函數指針:func = myFunc;
(3)通過函數指針調用函數:最后,可以通過函數指針來調用函數。這通常是通過在函數指針后加上括號,并在括號內提供函數所需的參數來實現的。例如,可以這樣通過函數指針調用函數:int res = func(a, b);
需要注意的是,函數指針的使用需要謹慎,因為錯誤的使用可能會導致程序崩潰或其他未定義行為。在使用函數指針時,應確保函數指針指向的函數具有正確的返回類型和參數類型,并且在調用函數時提供了正確的參數。
此外,函數指針也有一些特定的用途,例如可以作為函數的參數,或者用于實現回調函數等高級功能。在這些情況下,函數指針的使用可能會更加復雜,需要更深入的理解和實踐。
如下為樣例代碼:

#include<stdio.h>  // 定義一個函數,它接受一個整數參數并返回一個整數  
int add(int a, int b) 
{return a + b;
}// 定義一個函數指針類型  
typedef int(*func)(int, int);// 主函數  
int main() 
{// 定義一個函數指針變量并初始化  func ptr = add;// 使用函數指針調用函數  int res = ptr(1, 2);printf("the result is: %d\n", res);  // 輸出:The result is: 3  return 0;
}

上面代碼的輸出為:

the result is: 3

在上面代碼中,首先定義了一個函數 add ,它接受兩個整數參數并返回它們的和。然后,我們定義了一個函數指針類型 func ,它指向一個接受兩個整數參數并返回一個整數的函數。
在 main 函數中,定義了一個 func 類型的變量 ptr ,并將 add 函數的地址賦值給它。然后,通過 ptr 調用 add 函數,并將結果存儲在 res 變量中。最后打印出這個結果。

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

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

相關文章

AI繪畫與修圖:重塑數字藝術的新紀元

文章目錄 一、AI繪畫與修圖的原理二、AI繪畫的應用三、AI修圖的優勢四、面臨的挑戰五、未來發展趨勢《AI繪畫與修圖實戰&#xff1a;PhotoshopFirefly從入門到精通 輕松玩轉AI繪畫與修圖實戰》亮點內容簡介作者簡介 隨著人工智能技術的飛速發展&#xff0c;AI繪畫與修圖已經成為…

如何理解和區分訓練集、測試集和驗證集

如何理解和區分訓練集、測試集和驗證集 &#x1f308; 個人主頁&#xff1a;高斯小哥 &#x1f525; 高質量專欄&#xff1a;Matplotlib之旅&#xff1a;零基礎精通數據可視化、Python基礎【高質量合集】 &#x1f4a1; 創作高質量博文&#xff0c;分享更多關于深度學習、PyTor…

靡語IT:Vue精講(一)

Vue簡介 發端于2013年的個人項目&#xff0c;已然成為全世界三大前端框架之一&#xff0c;在中國大陸更是前端首選。 它的設計思想、編碼技巧也被眾多的框架借鑒、模仿。 紀略 2013年&#xff0c;在Google工作的尤雨溪&#xff0c;受到Angular的啟發&#xff0c;從中提取自…

soc(十七) SOC市場分類

桌面服務器集中式服務器架構和基于ARM微服務器架構的存儲差別在哪&#xff1f; http://www.dostor.com/p/54167.html 手機飛行器汽車家庭監控安防路由器

【前端素材】推薦優質后臺管理系統Protable平臺模板(附源碼)

一、需求分析 后臺管理系統是一種用于管理和監控網站、應用程序或系統的在線工具。它通常是通過網頁界面進行訪問和操作&#xff0c;用于管理網站內容、用戶權限、數據分析等。當我們從多個層次來詳細分析后臺管理系統時&#xff0c;可以將其功能和定義進一步細分&#xff0c;…

華為配置CAPWAP雙棧覆蓋業務示例

配置CAPWAP雙棧覆蓋業務示例 組網圖形 圖1 配置CAPWAP雙棧覆蓋業務示例組網圖 業務需求組網需求數據規劃配置思路配置注意事項操作步驟配置文件 業務需求 企業用戶接入WLAN網絡&#xff0c;以滿足移動辦公的最基本需求。且在覆蓋區域內移動發生漫游時&#xff0c;不影響用戶的業…

解決 PLC QModbusTcpClient 通信自動斷開

項目場景&#xff1a; 提示&#xff1a;這里簡述項目相關背景&#xff1a; 例如&#xff1a;項目場景&#xff1a;QModbusTcpClient 通信 問題描述 提示&#xff1a;這里描述項目中遇到的問題&#xff1a; QModbusTcpClient 連接后&#xff0c;稍微停一段時間&#xff0c;就…

LeetCode10. Regular Expression Matching——完全背包

文章目錄 一、題目二、題解 一、題目 Given an input string s and a pattern p, implement regular expression matching with support for ‘.’ and ‘*’ where: ‘.’ Matches any single character.???? ‘*’ Matches zero or more of the preceding element. The…

【selenium】三大切換 iframe 彈窗alert 句柄window 和 鼠標操作

目錄 一、iframe 1、切換方式&#xff1a; 1、第一種情況&#xff1a; 2、第二種情況&#xff1a; 方式1: 先找到iframe&#xff0c;定位iframe元素&#xff08;可以通過元素定位的各種方式&#xff1a;xpath&#xff0c;css等等&#xff09;&#xff0c;用對象接收&…

MyBatis Plus中的動態表名實踐

隨著數據庫應用的不斷發展&#xff0c;面對復雜多變的業務需求&#xff0c;動態表名的處理變得愈發重要。在 MyBatis Plus&#xff08;以下簡稱 MP&#xff09;這一優秀的基于 MyBatis 的增強工具的支持下&#xff0c;我們可以更便捷地應對動態表名的挑戰。本文將深入研究如何在…

美創新一代數據安全管理平臺宣傳片「龍」重登場

美創新一代數據安全管理平臺&#xff08;DSM Cloud&#xff09;產品宣傳片 國產化、混合多云環境催生愈加復雜的數據安全防護、管理及可持續運營挑戰。 美創新一代數據安全管理平臺&#xff08;DSM Cloud&#xff09;&#xff0c;圍繞韌性數據安全體系&#xff0c;聚焦全域數據…

[HTML]Web前端開發技術27(HTML5、CSS3、JavaScript )JavaScript基礎——喵喵畫網頁

希望你開心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你點贊&#xff01; 最后的最后&#xff0c;關注喵&#xff0c;關注喵&#xff0c;關注喵&#xff0c;佬佬會看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你對我真的…

activeMq將mqtt發布訂閱轉成消息隊列

1、activemq.xml置文件新增如下內容 2、mqttx測試發送&#xff1a; 主題&#xff08;配置的模糊匹配&#xff0c;為了并發&#xff09;&#xff1a;VirtualTopic/device/sendData/12312 3、mqtt接收的結果 4、程序處理 package comimport cn.hutool.core.date.DateUtil; imp…

ReactNative進階(二十三)error: no type or protocol named ‘RCTBridgeModule’問題修復

文章目錄 一、前言三、拓展閱讀 一、前言 Jenkins組包RN技術棧實現的iOS應用時&#xff0c;遇到以下錯誤提示信息&#xff1a; error: no type or protocol named ‘RCTBridgeModule’ interface RCTEventDispatcher : NSObject <RCTBridgeModule>error: cannot find i…

【AIGC】基于深度學習的圖像生成與增強技術

摘要&#xff1a; 本論文探討基于深度學習的圖像生成與增強技術在圖像處理和計算機視覺領域的應用。我們綜合分析了主流的深度學習模型&#xff0c;特別是生成對抗網絡&#xff08;GAN&#xff09;和變分自編碼器&#xff08;VAE&#xff09;等&#xff0c;并就它們在實際應用中…

嵌入式linux開發 (三十四) 內存管理2.0(6) 各種段(.code .rodata .data .bss .stack .heap)的含義

我們知道, 邏輯程序在連接的時候在elf 文件中會有 .code .rodata .data 然后在內存中才會有 .code .rodata .data那么為什么鏈接器在鏈接生成的elf文件中會有這些段呢?這涉及到鏈接器的歷史問題

小程序性能優化

背景 在開發小程序的過程中我們發現&#xff0c;小程序的經常會遇到性能問題&#xff0c;尤其是在微信開發者工具的時候更是格外的卡&#xff0c;經過排查發現&#xff0c;卡頓的頁面有這么多的js代碼需要加載&#xff0c;而且都是在進入這個頁面的時候加載&#xff0c;這就會…

Java架構師之路九、設計模式:常見的設計模式,如單例模式、工廠模式、策略模式、橋接模式等

目錄 常見的設計模式&#xff1a; 單例模式&#xff1a; 工廠模式&#xff1a; 策略模式&#xff1a; 橋接模式&#xff1a; 責任鏈模式&#xff1a; Java架構師之路八、安全技術&#xff1a;Web安全、網絡安全、系統安全、數據安全等-CSDN博客Java架構師之路十、框架和工…

Android 仿信號格子強度動畫效果實現

效果圖 在 Android 中&#xff0c;如果你想要繪制一個圓角矩形并使其居中顯示&#xff0c;你可以使用 Canvas 類 drawRoundRect 方法。要使圓角矩形居中&#xff0c;你需要計算矩形的位置&#xff0c;這通常涉及到確定矩形左上角的位置&#xff08;x, y&#xff09;&#xff0…

Leetcode 第 384 場周賽題解

Leetcode 第 384 場周賽題解 Leetcode 第 384 場周賽題解題目1&#xff1a;3033. 修改矩陣思路代碼復雜度分析 題目2&#xff1a;3034. 匹配模式數組的子數組數目 I思路代碼復雜度分析 題目3&#xff1a;3035. 回文字符串的最大數量思路代碼復雜度分析 題目4&#xff1a;3036. …