C語言(指針)2

? ? ? ? ? ? ? ? ? ???Hi~!這里是奮斗的小羊,很榮幸各位能閱讀我的文章,誠請評論指點,關注+收藏,歡迎歡迎~~? ? ?

????????????????????????💥個人主頁:小羊在奮斗

????????????????????????💥所屬專欄:C語言? ?

????????本系列文章為個人學習筆記,在這里撰寫成文一為鞏固知識,二為同樣是初學者的學友展示一些我的學習過程及心得。文筆、排版拙劣,望見諒。?

? ? ? ? ? ? ????????????????? ? 3、指針變量類型的意義

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.1指針的解引用

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.2指針 +- 整數

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3.3void *類型

?????????????????????????????????4、const 變量

????????????????????????????????????????????????4.1const 修飾變量

????????????????????????????????????????????????4.2const 修飾指針變量

3、指針變量類型的意義

? ? ? ? 既然指針變量的大小與類型沒有關系,那為什么還要有不同的指針類型呢?

? ? ? ? 在某些情況下,指針類型還是有很大意義的。

?????????3.1指針的解引用

? ? ? ? 這里來舉一個例子探討指針變量類型的意義。

? ? ? ? 如果對調試還不太熟悉可以看這篇文章 —>?VS調試技巧

? ? ? ? 觀察下面代碼在調試時內存中的變化:?

? ? ? ? 我們先給a賦值為0x11223344(16進制),在內存窗口可以看到,然后再通過*pa將a該為0,可以看到內存中也發生了相應的改變。

? ? ? ? 既然指針變量的大小都是一樣的,與指針的類型沒有關系,那我們用char *類型來接收a的地址按理說應該也可以,而且&a取出來的地址都是首地址(一個內存空間,大小是1個字節),好像沒什么問題。從上面調試的結果來看確實放進去了0x11223344這個值。

????????我們接著調試看一下結果:

? ? ? ? 好像跟我們想的不一樣,執行完 *pa = 0;這條語句后只是把最小的地址(一個內存單元)中的值該為了0。這是為什么呢?

?????????因為,指針類型決定了對指針解引用的時候有多大的權限,也就是一次能操作幾個字節這就是指針變量類型的意義。比如:char *類型的指針解引用訪問一個字節,int *類型的指針解引用訪問4個字節。

? ? ? ? 3.2指針+-整數

?????????觀察下面的代碼:

? ? ? ? 跟我們想的一樣,&a、pa、pc的值是一樣的,但當我們給&a、pa、pc加一個整數1的時候得到了不一樣的結果,通過觀察,&a和pa的值都增加了4,?而pc的值只增加了1。其中的原因還是和3.1中一樣,我們再來通過下面的圖解釋一下:

? ? ? ? 可以理解為他們走的格數不一樣,一個格子就是一個內存單元也就是1個字節空間,a和pa一個是int類型一個是int *類型,所以它們走4個格子;而pc是char *類型,所以它走1個格子。?

? ? ? ? 減一個整數也是同樣的道理。?

? ? ? ? ?3.3void *類型

? ? ? ? 在指針類型中有一種特殊的類型是 void * 類型的,為無具體類型的指針(泛型指針),這種類型的指針可以用來接收任意類型的地址。但是有一定的局限性,void *類型的指針不能直接進行指針的 +- 整數和解引用運算。了解了上面的內容,這其中的原因相信我們已經心知肚明。

? ? ? ? 其實,我們 char *pc = &a;是有問題的,&a取出的地址畢竟是int *類型。雖然能正常運行,但是編譯器也有相應的警告:

? ? ? ? 但是我們用void *去接受就沒有任何問題:?

? ? ? ? 雖然void *類型的指針不能直接進行解引用操作也不能 +- 整數的操作,?但是當我們不知道別人給我們傳的地址是什么類型的時候,我們就可以放心地去用void *來接收,這就是它的作用。

? ? ? ? 一般void *類型的指針是使用在函數參數的部分,用來接收不同類型數據的地址,這樣的設計可以實現泛型編程的效果,使得一個函數來處理多種類型的數據。在后面的文章中會深入探討。?

4、const 變量

? ? ? ? 4.1const 修飾變量

? ? ? ? 變量變量,顧名思義就是可以改變的量,當我們創建一個整整變量a并賦初值10:int a = 10;如果我們想改變a的值隨時就可以改,誰讓它是變量呢?

? ? ? ? 那如果我們想訓練一下這個變量a,讓它變得強大,誰都改變不了它,有沒有辦法呢?

? ? ? ? 辦法就是使用const修飾,當我們用const修飾了變量a后,它就擁有了常量的屬性,我們知道常量是不能被改變的量。

? ? ? ? 當變量a被const “訓練” 過后,我們再試圖去改變它的值,就會發現編譯器報錯,說a是不可被修改的,變量a得到了 “強化”。

????????但是const修飾的變量本質上還是變量,只是不能被修改。我們也可以用例子證明這句話:

? ? ? ??前面的文章中我們說過,創建數組的時候數組長度只能為大于0的整型常量或整型常量表達式,不能包含變量。所以上面的例子就證明了變量a即使被const修飾,具有了常量屬性,但本質還是變量。

? ? ? ? 4.2const 修飾指針變量

? ? ? ? 看了上面的內容,我們可能會有一個想法。

? ? ? ? 在4.1中,const修飾變量a后,我們就不能改變a的值了,但上面我們只是直接去改發現改不了,那間接地去改呢?因為上篇文章我們剛了解了一點指針,知道通過指針的解引用操作可以間接地去找到、操作一些值,那這里能不能創建一個指針變量pa,將變量a的地址存到pa中,再解引用pa來實現間接改變a的值呢?

? ? ? ? 來實驗一下我們的想法:

? ? ? ? ?可以看到,我們的想法是有道理的,通過指針的解引用操作確實間接地改變了a的值。?

?????????但是,但是,這樣做其實是不對的。這就像門被鎖了翻窗戶一樣,鎖門的目的就是為了不讓別人進得去房間,我們還為了進去而翻窗戶,肯定是不合規矩的。為什么要有const呢?不就是為了讓變量具有常屬性不能被改變嘛,那我們還去改變它就顯得沒事找事了。

? ? ? ? 不過,雖然大多數的人都是守法公民,但還是有個別不聽勸的,非要 “翻窗戶”,那有沒有辦法解決呢?答案肯定是有的,因為我們不能容忍任何一個人不 “遵紀守法”。

? ? ? ? 既然指針的解引用可以間接地去改變const修飾的變量的值,那我們干脆把指針變量也用const修飾,因為指針變量也是變量嘛。

? ? ? ? const修飾指針變量時,const可以放到 “ * ” 的左邊也可以放到 “ * ” 的右邊,這樣就會產生三種情況(其中前兩種情況的效果是一樣的):

? ? ? ? const 放在?“ * ” 的左邊:

? ? ? ? 可以看到,當我們改變 *pa (也就是改變a)的值的時候,編譯器提示錯誤,但改變 pa 的值是可以的。所以,當const在 “ * ” 左邊的時候修飾的是*pa ,這時候*pa具有常量屬性

? ? ? ? 上面代碼中改變pa的值事實上是改變了指針變量pa的指向,也就是此時指針變量pa里面存的是變量b的地址。

? ? ? ? const 放在 “ * ” 的右邊:

? ? ? ? 可以看到,當const在 “ * ” 右邊的時候,改變*pa的值是可以的,但改變指針變量pa的指向,也就是改變指針變量pa里存的地址是不可行的。?所以,當const在 “ * ” 右邊的時候修飾的是pa,這時候pa具有常量屬性。

? ? ? ? 還有,當 “ * ” 的左邊和右邊都有const修飾的時候,*pa和pa都具有常量屬性,都不能改變。

????????如果覺得我的文章還不錯,請點贊、收藏 + 關注支持一下,我會持續更新更好的文章。

????????????????????????????????????????? 點擊跳轉下一節 —>?C語言(指針)3

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

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

相關文章

聽說SOLIDWORKS科研版可以節約研發成本?

近幾年來,政府越來越重視科研帶動產業,績效優良的產業技術研究院對于國家和地區的學術成果轉化、技術創新、產業發展等具有不可忽視的促進和帶動作用。研究院會承擔眾多新產業的基礎研究工作,而常規的基礎研究需要長期的積累,每個…

JAVA畢業設計141—基于Java+Springboot+Vue的物業管理系統(源代碼+數據庫)

畢設所有選題: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的物業管理系統(源代碼數據庫)141 一、系統介紹 本項目前后端分離,分為管理員、員工、用戶三種角色(角色權限可自行分配) 1、用戶: …

Nginx詳解:高性能HTTP和反向代理服務器

Nginx詳解:高性能HTTP和反向代理服務器 一、引言 Nginx(發音為“engine x”)是一個開源的高性能HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP代理服務器。由于其出色的性能和穩定性,Nginx已經成為互聯網上最受歡迎的…

asp.net結課作業中遇到的問題解決4

目錄 1、vs2019每次運行一次項目之后,樣式表的格式就算在vs2019上改變了,在瀏覽器中顯示的還是以前的樣式,所以應該如何修改 2、如何實現選擇下拉框之后,顯示所選擇的這個類型的書籍的名稱 3、如何實現點擊首頁顯示的書籍&#…

高清模擬視頻采集卡CVBS四合一信號采集設備解析

介紹一款新產品——LCC261高清視頻采集與編解碼一體化采集卡。這款高品質的產品擁有卓越的性能表現和豐富多樣的功能特性,能夠滿足廣大用戶對于高清視頻采集、處理以及傳輸的需求。 首先,讓我們來了解一下LCC261的基本信息。它是一款基于靈卡技術研發的高…

Shell三劍客之sed

前言: Shell三劍客是grep、sed和awk三個工具的簡稱,因功能強大,使用方便且使用頻率高,因此被戲稱為三劍客,熟練使用這三個工具可以極大地提升運維效率。 sed是一個流編輯器,用于對文本進行編輯、替換、刪除等操作。sed…

LeetCode2095刪除鏈表的中間節點

題目描述 給你一個鏈表的頭節點 head 。刪除 鏈表的 中間節點 ,并返回修改后的鏈表的頭節點 head 。長度為 n 鏈表的中間節點是從頭數起第 ?n / 2? 個節點(下標從 0 開始),其中 ?x? 表示小于或等于 x 的最大整數。對于 n 1、…

深入探索Android簽名機制:從v1到v3的演進之旅

引言 在Android開發的世界中,APK的簽名機制是確保應用安全性的關鍵環節。隨著技術的不斷進步,Android簽名機制也經歷了從v1到v3的演進。本文將帶你深入了解Android簽名機制的演變過程,揭示每個版本背后的技術細節,并探討它們對開…

淺談下MYSQL表設計的幾條規則

作為后端開發人員,避免不了和數據庫打交道,可是我們怎么能夠設計出高效,可維護,可擴展的數據庫設計呢,在這里我總結了幾個點,供大家參考。 在寫之前,可能需要重復下數據庫設計的范式原則&#…

docker-compose.yml文件詳解

創建 docker-compose.yml 文件是使用 Docker Compose 管理多容器應用的第一步。這個 YAML 格式的文件詳細描述了服務、網絡和卷等組件以及它們之間的關系。下面是對一個典型 docker-compose.yml 文件結構的詳解: 基本結構 一個基本的 docker-compose.yml 文件通常…

水雨情監測系統—實時監測水位信息

TH-SW3水雨情監測系統是一種專門用于實時監測和收集水文氣象數據的自動化系統。它能夠實時獲取區域內降雨和水情數據,并將其存儲到數據庫中進行分析處理,從而為防汛指揮人員提供及時準確的信息服務。 水雨情監測系統的主要功能包括實時監測水位、流速、流…

C++類與對象基礎探秘系列(二)

目錄 類的6個默認成員函數 構造函數 構造函數的概念 構造函數的特性 析構函數 析構函數的概念 析構函數的特性 拷貝構造函數 拷貝構造函數的概念 拷貝構造函數的特性 賦值運算符重載 運算符重載 賦值運算符重載 const成員 const修飾類的成員函數 取地址及const取地址操作…

MySQL文檔_下載

可能需要:MySQL下載–》更新版本–》遷移數據庫到MySQL 以下都不重要【只要確定好需要安裝版本,找到對應的版本下載,安裝,設置即可】 下載、安裝: Determine whether MySQL runs and is supported on your platform…

iCloud如何高效利用:提升蘋果生態體驗

iCloud如何高效利用:提升蘋果生態體驗 引言 iCloud是蘋果公司提供的云服務,它允許用戶在蘋果設備之間無縫同步數據和內容。隨著數字化生活的不斷發展,有效地管理和利用iCloud對于提高工作效率和生活質量變得越來越重要。本文將詳細介紹如何…

Debian12安裝后更換為國內鏡像源,切換root用戶,解決用戶名不在sudoers文件中此事將被報告

選擇Debian作為編程開發最佳Linux的理由: Debian是面向程序員的最古老,最出色的Linux發行版之一。Debian提供了具有.deb軟件包管理兼容性的超穩定發行版。Debian為程序員提供了許多最新功能。因此,它具有一個特殊的編程空間。Debian是開發人員…

彌合孤島:克服構建 DevOps 文化的挑戰

持續變革正在發生軟件開發行業。DevOps 因其對自動化、協作和持續改進的關注而成為優化軟件交付并彌合開發和運營團隊之間鴻溝的重要方法。然而,過渡到真正的 DevOps 文化并非沒有挑戰。本文探討了您在追求 DevOps 時可能面臨的障礙并提供了解決方案。 01 了解 Dev…

數據結構 順序表1

1. 何為順序表: 順序表是一種線性數據結構,是由一組地址連續的存儲單元依次存儲數據元素的結構,通常采用數組來實現。順序表的特點是可以隨機存取其中的任何一個元素,并且支持在任意位置上進行插入和刪除操作。在順序表中&#xf…

算法-卡爾曼濾波之基本數學的概念

1.均值 定義:均值是一組數據中所有數值的總和除以數據的數量。均值是數據的中心趨勢的一種度量,通常用符號 xˉ 表示。 :對于包含 n 個數據的數據集 {𝑥1,𝑥2,...,𝑥𝑛},均值 xˉ 計…

Spring原理

目錄 一、Bean作用域 1、Bean作用域概念 2、Bean的六種作用域 3、舉例演示bean的幾種作用域 二、Bean的生命周期 1、Bean對象的生命周期 2、演示Bean對象的生命周期 三、SpringBoot的自動配置 1、概念 2、spring將對象存入容器中的原理 一、Bean作用域 在前面spring…

C語言(指針)7

Hi~!這里是奮斗的小羊,很榮幸各位能閱讀我的文章,誠請評論指點,關注收藏,歡迎歡迎~~ 💥個人主頁:小羊在奮斗 💥所屬專欄:C語言 本系列文章為個人學習筆記&#x…