const修飾指針用法詳解

目錄

一、const修飾變量

繞過const限制的問題

二、const修飾指針變量

1、無const修飾的指針

2、const放在*左邊

3、const放在*右邊

4、*兩邊都有const

三、使用建議

四、記憶技巧


一、const修飾變量

????????在C語言中,變量默認是可修改的。如果我們希望某個變量不能被修改,可以使用const關鍵字進行修飾。

#include <stdio.h>int main()
{int m = 0;m = 20;    // m是可以修改的const int n = 0;n = 20;    // 編譯錯誤:n不能被修改return 0;
}

? ? const修飾的變量n本質仍然是變量,但在語法層面添加了限制,任何直接修改n的操作都會導致編譯錯誤。

繞過const限制的問題

雖然直接修改const變量會導致編譯錯誤,但通過指針間接修改在語法上是可能的:

#include <stdio.h>int main()
{const int n = 0;printf("n = %d\n", n);  // 輸出: n = 0int* p = &n;            // 獲取n的地址*p = 20;                // 通過指針修改n的值printf("n = %d\n", n);  // 輸出: n = 20return 0;
}

運行結果:

????????這種操作雖然能修改n的值,但違背了使用const的初衷。為了真正保護變量不被修改,我們需要正確使用const修飾指針。


二、const修飾指針變量

const修飾指針變量時,根據const關鍵字相對于星號(*)的位置不同,其含義也不同:

int * p;//沒有const修飾? int const * p;//const 放在*的左邊做修飾
//上面這一句等價于
const int * p;//const 放在*的左邊做修飾 int * const p;//const 放在*的右邊做修飾

1、無const修飾的指針

void test1()
{int n = 10;int m = 20;int* p = &n;*p = 20;  // 可以修改指針指向的內容p = &m;   // 可以修改指針本身
}

2、const放在*左邊

void test2()
{int n = 10;int m = 20;const int* p = &n;  // 或 int const* p = &n;*p = 20;  // 編譯錯誤:不能通過指針修改指向的內容p = &m;   // 可以修改指針本身
}

3、const放在*右邊

void test3()
{int n = 10;int m = 20;int* const p = &n;*p = 20;  // 可以修改指針指向的內容p = &m;   // 編譯錯誤:不能修改指針本身
}

4、*兩邊都有const

void test4()
{int n = 10;int m = 20;const int* const p = &n;*p = 20;  // 編譯錯誤:不能通過指針修改指向的內容p = &m;   // 編譯錯誤:不能修改指針本身
}

三、使用建議

  1. 保護數據不被修改:如果希望數據不被修改,應該使用const type*const type* const形式

  2. 保護指針不被修改:如果希望指針本身不被修改,應該使用type* const形式

  3. 最佳實踐:在函數參數中,如果函數不需要修改指針指向的數據,應該使用const修飾指針參數,這樣既能保護數據,又能使函數接受const和非const的實參


四、記憶技巧

可以這樣記憶const修飾指針的規則:

  • const在*左邊:保護"星"指向的內容(數據不可變)

  • const在*右邊:保護"星"本身(指針不可變)

  • 兩邊都有const:都保護

????????這種修飾方式在C/C++中廣泛使用,特別是在函數參數傳遞和API設計中,能夠有效提高代碼的安全性和可維護性。

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

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

相關文章

pcl法線估計的踩坑

1&#xff0c;normalestimation對點云法線的評估&#xff0c;只輸出法線向量&#xff0c;并不輸出xyz值。如果輸出類型是pointnormal&#xff0c;那么這點云的法向量有值&#xff0c;xyz值都是02&#xff0c;添加點云xyz數據。可以使用 pcl::concatenatefields(*a,*b,*c)函數p…

利用Minicsv庫解析csv文件的c程序及讀入測試

上午的c程序寫入xlsx較快但不正確&#xff0c;python程序雖正確但過慢。所以找了一個全部源程序加起來不到4K字節的C語言csv解析庫Minicsv&#xff0c;來改寫&#xff0c;改寫結果如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h…

企微用戶部門同步HRS系統

企微用戶導入HR系統流程說明 概述 本文檔詳細說明了WechatUserImportServiceImpl.importWechatUsersToHrs()方法的業務流程和實現邏輯。該方法負責將企業微信用戶數據同步導入到HR管理系統中&#xff0c;包括員工信息、工作信息和任職記錄的創建與更新。 主要功能 數據同步…

告別傳統SEO!擁抱下一代流量密碼:生成式引擎優化(GEO)實戰指南

前言&#xff1a;為什么你的“最佳實踐”SEO正在失效&#xff1f;你是否發現&#xff0c;即使嚴格遵循了谷歌自2019年以來的所有“最佳實踐”&#xff0c;你的技術博客或產品文檔的流量依舊增長乏力&#xff0c;甚至不升反降&#xff1f;你不是一個人。問題在于&#xff0c;游戲…

week1-[一維數組]傳送

week1-[一維數組]傳送 題目描述 有 nnn 個傳送門&#xff0c;從第 iii 個傳送門進去后會被傳送到第 aia_iai? 個傳送門&#xff0c;進而被傳送到第 aaia_{a_i}aai?? 個傳送門&#xff0c;如此一直下去……小 A 想知道從第 kkk 個傳送門進去后&#xff0c;能不能回到第 kkk 個…

【18】目心智能——目心智能 嵌入式一面 ,校招,面試問答記錄

目心智能——目心智能 嵌入式一面 &#xff0c;校招&#xff0c;面試問答記錄 1 簡單自我介紹2 你做了這么多算法&#xff0c;為什么不找算法的&#xff1f;3 我們主要還是軟件開發&#xff0c;不做結構設計4 模電知識6 CSDN應該附鏈接在簡歷上&#xff0c;稍后發給我&#xff…

C++第二十課:快遞運費計算器 / 黑白配+石頭剪刀布小游戲

快遞運費計算器幫一家快遞站點開發一個快遞運費計算器&#xff0c;快遞站點人員只需要輸入包裹重量和地點編號即可計算出對應的運費。假設快遞費計算規則如下&#xff1a;首重&#xff1a;3公斤 3公斤以內&#xff1a;1.東三省/寧夏/青海/海南&#xff1a;12元&#xff0c;2.新…

網絡安全藍隊常用工具全景與實戰指南

摘要 在現代信息系統的安全防護中&#xff0c;藍隊承擔著防御、檢測、響應和持續改進的核心職責。要實現高效、可持續的防御能力&#xff0c;藍隊需要一整套成熟、可靠的工具集來進行威脅情報收集、日志分析、入侵檢測、漏洞評估、端點防護、網絡流量監控、事件響應與取證等工作…

基于 Flink 的淘寶實時數據管道設計:商品詳情流式處理與異構存儲

引言在電子商務領域&#xff0c;實時數據處理能力已成為企業核心競爭力的重要組成部分。淘寶作為中國領先的電商平臺&#xff0c;每天產生海量的商品數據&#xff0c;這些數據需要被實時處理、分析并分發到各種存儲系統中&#xff0c;以支持搜索、推薦、庫存管理等關鍵業務。本…

面試題:【多線程問題,三個線程A,B,C;C線程依賴B線程的結果執行,怎么控制】

在 Java 中&#xff0c;若需要控制線程間的依賴關系&#xff08;如 C 線程依賴 B 線程的結果&#xff09;&#xff0c;可以通過以下幾種方式實現&#xff1a; 方案 1&#xff1a;使用 CountDownLatch CountDownLatch 是一個同步工具類&#xff0c;允許一個或多個線程等待其他線…

React useMemo 深度指南:原理、誤區、實戰與 2025 最佳實踐

把“為什么用、怎么用、用錯了怎么辦”一次講透&#xff0c;附 React 19 自動優化前瞻。一、useMemo 是什么&#xff1f; 一句話&#xff1a; useMemo 記住&#xff08;緩存&#xff09;昂貴計算結果&#xff0c;只在依賴變化時重新計算。 const memoValue useMemo(() > {…

[ HTML 前端 ] 語法介紹和HBuilderX安裝

目錄 一. HTML 1.概述 2. 安裝前端開發工具 (1)HBuilderX下載 (2)創建html項目和使用 3. HTML基礎 1.標簽 (1).標簽定義: (2).標簽結構: (3).標簽屬性: 2.常用標簽: 3.特殊符號: 4.表格(table) (1)基本標簽: (2)基本結構: (3)表格屬性: 5.表單(form) (1). 表單概述…

Spring Cloud系列—Alibaba Sentinel熔斷降級

上篇文章&#xff1a; Spring Cloud系列— Alibaba Sentinel限流https://blog.csdn.net/sniper_fandc/article/details/149944260?fromshareblogdetail&sharetypeblogdetail&sharerId149944260&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link…

Spring Boot 使用 @NotBlank + @Validated 優雅校驗參數

在日常開發中&#xff0c;我們常用 if (isBlank(...)) 來判斷參數是否為空&#xff0c;但這種方式不僅繁瑣&#xff0c;而且容易遺漏。 Spring 生態中推薦使用 JSR-303 校驗注解&#xff08;NotBlank、NotNull 等&#xff09;配合 Validated 實現自動校驗&#xff0c;大幅減少手…

網絡安全(Java語言)簡單腳本匯總 (一)

文章目錄敏感信息探測腳本源代碼思路URL批量存活探測器源代碼思路端口掃描器源代碼思路 敏感信息探測腳本 源代碼/*** description 該腳本通過分析HTTP響應頭&#xff0c;來檢測可能暴露服務器信息的安全隱患*/import java.io.IOException; import java.net.HttpURLConnection;…

buuctf_NSBlogin_http_upload(極客2019+ACTF2020新生賽)

今天做三1個web 題目&#xff1a;NSB_login用戶名有admin&#xff0c;看源碼&#xff1a;I like rockyou&#xff01;今天學習到&#xff0c;kali里面有密碼爆破的文件叫rockyou.txt&#xff08;/usr/share/wordlists/&#xff09;&#xff08;沒kali也可以去https://gitcode.c…

IDEA如何引用brew安裝的openjdk

因為 brew 安裝的 openjdk@21 目錄結構和 IDEA 期望的 JDK 目錄不一樣。所以默認brew安裝的jdk,在IDEA中是無法識別到的。 一、創建軟連接 sudo mkdir -p /Library/Java/JavaVirtualMachines sudo ln -sfn /usr/local/opt/openjdk@21/libexec/openjdk.jdk /Library/Java/Java…

【Unity3D】Spine黑線(預乘問題)、貼圖邊緣裁剪問題

一、黑線問題 Spine正確的導出和Unity導入設置&#xff08;解決黑邊/彩條帶問題&#xff09;_spine導出的圖片有黑邊-CSDN博客 采用&#xff08;已解決問題&#xff09; Texture 打包器啟用 Premultiply alpha ,禁用Bleed Unity Texture 設置中禁用 sRGB (Color Texture) 和…

嵌入式系統學習Day18(文件編程-系統調用文件IO)

- open#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 功能:打開文件 參數:pathname --- 文件名 flags 必選:O_RDONLYO_WRONLY…

Vue淺學

概述在最近的學習任務中了解了 Vue&#xff0c;并對其產生了濃厚的興趣&#xff0c;現在分享一下我的學習所得關鍵字其一statestate 是 Vuex 存儲中的“狀態對象”&#xff0c;用于存儲整個應用的共享數據&#xff08;如用戶信息、令牌、權限等&#xff09;&#xff0c;比如&am…