C語言—指針2

1. const 修飾變量

1.1 const修飾變量

變量被const修飾時,變量此時為常變量,本質為常量,語法上不可被修改,但是如果此時需要修改變量值,可以通過指針的方式修改。

雖然此時通過指針的方式確實修改了變量的值,但這并不符合const修飾變量的語法,為了防止const修飾的變量被修改,可以修飾指針變量,防止const修飾變量被修改。

1.2 const 修飾指針變量

const在*pb前表示pb指向的對象不可被修改,此時就很好的保護const修飾的變量值,上述const修飾的指針變量還可以寫成:int const *pb,語法上也是支持的。此時const修飾的指針變量可以防止指向的對象被修改,但是指針變量本身是可以被修改的。

原本指針變量是為了存放b的地址,指針變量本身未被修飾,存放變量c的地址后導致指針變量指向其它內存空間,為了防止指針變量指向其它內存空間,使用const修飾指針變量,修飾后的指針變量存放的地址不可被修改。

結論:const修飾指針變量的時候

const如果放在*的左邊,修飾的是指針指向的內容,保證指針指向的內容不能通過指針來改變。 但是指針變量本?的內容可變。

const如果放在*的右邊,修飾的是指針變量本?,保證了指針變量的內容不能修改,但是指針指向的內容,可以通過指針改變。

2. 野指針

野指針指向的內存空間是隨機的,不可知的,沒有明確限制的。

2.1 野指針成因

2.1.1 指針未初始化

2.1.2. 指針越界訪問

2.1.3 函數返回局部變量的指針

在vs2022環境下多次輸出的結果:多次輸出的均為隨機值

2.2 如何規避野指針

2.2.1 初始化指針

需要使用指針是,要明確指針存放的地址,對其進行初始化,當暫時不明確指針存放的地址,可以將其初始化為空指針NULL,c語言中空指針為void*0。

2.2.2 ??指針越界

需要訪問數組元素時,可以求出元素的個數,利用for循環進行訪問,防止越界

2.2.3?指針變量不再使?時,及時置NULL,指針使?之前檢查有效性

3. assert 斷?

assert.h 頭?件定義了宏 assert() ,?于在運?時確保程序符合指定條件,如果不符合,就報錯終?運?,這個宏常常被稱為“斷?”。

assert在c語言庫函數網站的詳細介紹:assert - C++ Reference

assert不僅可以用于判斷指針,還可以用于表達式的判斷:

按F10啟動調試,執行第二條assert語句時,系統報錯:窗口輸出具體的報錯原因

斷言失敗:Assertion failed: *pa>*pb,說明assert括號內的表達式為假,執行斷言。

4. 指針的使?和傳址調?

4.1 模擬strlen函數的實現

4.2 傳值調?和傳址調?

實現一個函數交換兩個數

第一次交換并沒有成功交換,輸出的結果還是num1=10? num2=20,這是因為Swap1函數接收的函數參數時,開辟了新的內存空間進行存num1和num2,改變的為x和y形參的的值,,函數棧幀銷毀時,x和y的值并不能存儲返回,因此x和y只是實參的一份臨時拷貝,改變形參并不一定改變實參;

第二次交換交換成功,將num1和 num2的地址作為參數傳參時,接收的函數參數改變時,是通過地址指向的位置改變,x指向num1的地址,y指向num2的位置,此時改變形參可以改變實參。

傳址調?,可以讓函數和主調函數之間建?真正的聯系,在函數內部可以修改主調函數中的變量;函數中只是需要主調函數中的變量值來實現計算,就可以采?傳值調?。如果函數內部要修改主調函數中的變量的值,就需要傳址調?。

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

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

相關文章

高級架構軟考之網絡OSI網絡模型

高級架構軟考之網絡: 1.OSI網絡模型: a.物理層: a.物理傳輸介質物理連接,負責數據傳輸,并監控數據 b.傳輸單位:bit c.協議: d:對應設備:中繼器、集線器 b.數據鏈路層: a.…

el-table計算表頭列寬,不換行顯示

1、在utils.js中封裝renderHeader方法 2、在el-table-column中引入: 3、頁面展示:

MySQL OCP和Oracle OCP怎么選?

近期oracle 為慶祝 MySQL 數據庫發布 30 周年,Oracle 官方推出限時福利:2025 年 4 月 20 日至 7 月 31 日期間,所有人均可免費報考 MySQL OCP(Oracle Certified Professional)認證考試(具體可查看MySQL OCP…

2025最新免費視頻號下載工具!支持Win/Mac,一鍵解析原畫質+封面

軟件介紹 適用于Windows 2025 最新5月蝴蝶視頻號下載工具,免費使用,無廣告且免費,支持對原視頻和封面進行解析下載,親測可用,現在很多工具都失效了,難得的幾款下載視頻號工具,大家且用且珍…

Python學習之路(八)-多線程和多進程淺析

在 Python 中,多線程(Multithreading) 和 多進程(Multiprocessing) 是實現并發編程的兩種主要方式。它們各有優劣,適用于不同的場景。 一、基本概念 特性多線程(threading)多進程(multiprocessing)并發模型線程共享內存空間每個進程擁有獨立內存空間GIL(全局解釋器鎖…

Spark緩存--persist方法

1. 功能本質 persist:這是一個通用的持久化方法,能夠指定多種不同的存儲級別。存儲級別決定了數據的存儲位置(如內存、磁盤)以及存儲形式(如是否序列化)。 2. 存儲級別指定 persist:可以通過傳入…

裸辭8年前端的面試筆記——JavaScript篇(一)

裸辭后的第二個月開始準備找工作,今天是第三天目前還沒有面試,現在的行情是一言難盡,都在瘋狂的壓價。 下邊是今天復習的個人筆記 一、事件循環 JavaScript 的事件循環(Event Loop)是其實現異步編程的關鍵機制。 從…

什么是死信隊列?死信隊列是如何導致的?

死信交換機(Dead Letter Exchange,DLX) 定義:死信交換機是一種特殊的交換機,專門用于**接收從其他隊列中因特定原因變成死信的消息**。它的本質還是交換機,遵循RabbitMQ中交換機的基本工作原理&#xff0c…

9. 從《蜀道難》學CSS基礎:三種選擇器的實戰解析

引言:當古詩遇上現代網頁設計 今天我們通過李白的經典詩作《蜀道難》來學習CSS的三種核心選擇器。這種古今結合的學習方式,既能感受中華詩詞的魅力,又能掌握實用的網頁設計技能。讓我們開始這場穿越時空的技術之旅吧! 一、HTML骨架…

三角網格減面算法及其代表的算法庫都有哪些?

以下是三角網格減面算法及其代表庫/工具的詳細分類,涵蓋經典算法和現代實現: ??1. 頂點聚類(Vertex Clustering)?? ??原理??:將網格空間劃分為體素柵格,合并每個柵格內的頂點。??特點??&#…

URP - 屏幕圖像(_CameraOpaqueTexture)

首先需要在unity中開啟屏幕圖像開關才可以使用該紋理 同樣只有不透明對象才能被渲染到屏幕圖像中 若想要該對象不被渲染到屏幕圖像中,可以將其Shader的渲染隊列改為 "Queue" "Transparent" 如何在Shader中使用_CameraOpaqueTexture&#xf…

vue 和 html 的區別

使用 Vue.js 和原生 HTML 開發 Web 應用有顯著的區別,主要體現在開發模式、功能擴展、性能優化和維護性等方面。以下是兩者的對比分析: 🧱 原生 HTML(HTML CSS JavaScript) 特點: 靜態結構:H…

LeetCode[226] 翻轉二叉樹

思路: 使用遞歸,歸根結底還是左右節點互相倒,那么肯定需要一個temp節點在中間傳遞,最后就是遞歸,沒什么說的 代碼: /*** Definition for a binary tree node.* public class TreeNode {* int …

冪等的幾種解決方案以及實踐

目錄 什么是冪等? 解決冪等的常見解決方案: 唯一標識符案例 數據庫唯一約束 案例 樂觀鎖案例 分布式鎖(Distributed Locking) 實踐精選方案 首先 為什么不直接使用分布式鎖呢? 自定義實現冪等組件&#xff01…

PowerShell中的Json處理

1.定義JSON字符串變量 PS C:\WINDOWS\system32> $body {"Method": "POST","Body": {"model": "deepseek-r1","messages": [{"content": "why is the sky blue?","role"…

奧威BI:AI+BI深度融合,重塑智能AI數據分析新標桿

在數字化浪潮席卷全球的今天,企業正面臨著前所未有的數據挑戰與機遇。如何高效、精準地挖掘數據價值,已成為推動業務增長、提升競爭力的核心議題。奧威BI,作為智能AI數據分析領域的領軍者,憑借其創新的AIBI融合模式,正…

【Linux網絡】網絡協議基礎

網絡基礎 計算機網絡背景 獨立模式:計算機之間相互獨立 網絡互聯:多臺計算機連接在一起,完成數據共享 局域網LAN:計算機數量更多了,通過交換機和路由器連接在一起 廣域網WAN:將遠隔千里的計算機都連在一起 所謂"局域網"和"廣域網"只是一個相對的概念.比…

LabVIEW表面粗糙度測量及算法解析

在制造業和科研領域,表面粗糙度測量對保障產品質量、推動材料研究意義重大。表面粗糙度作為衡量工件表面加工質量的關鍵指標,直接影響著工件諸如磨損、密封、疲勞等機械性能。隨著技術的發展,LabVIEW 在表面粗糙度測量及數據處理中發揮著不可…

深入探索 JavaScript 中的模塊對象

引言 在現代 JavaScript 開發中,模塊化編程是一項至關重要的技術。它允許開發者將代碼拆分成多個獨立的模塊,每個模塊專注于單一功能,從而提高代碼的可維護性、可測試性和復用性。而模塊對象則是模塊化編程中的核心概念之一,它為…

Linux——Mysql數據庫

目錄 一,數據庫簡介 二,數據庫的基本概念 1,數據 2,數據庫和數據庫表 3,數據庫管理系統和數據庫系統 三,主流數據庫介紹 四,數據庫的兩大類型 1,關系型數據庫 主鍵 外鍵 2…