1. 程式人生 > >常量指標和指標常量的區別詳解

常量指標和指標常量的區別詳解

在C/C++中關鍵字const用來定義一個只讀的變數或者物件,有如下優點
    (1)便於型別檢查,如函式的函式 fun(const int a) a的值不允許變,這樣便於保護實參。
    (2)功能類似與巨集定義,方便引數的修改和調整。如 const int max = 100;
    (3)節省空間,如果再定義a = max,b=max。。。就不用在為max分配空間了,而用巨集定義的話就一直進行巨集替換併為變數分配空間
    (4)為函式過載提供參考

而C/C++中常把指標和常量混合起來使用,其最大的用途就是作為函式的形式引數,保證實參在被調函式中的不可改變的特性,那到底常量指標和指標常量有什麼區別呢?


下面通過一個例子來解析 常量指標 和 指標常量,我們先總結一下 常量指標 和 指標常量 的區別

首先一定要明白哪種定義方式是常量指標,哪種是指標常量,這裡可以記住三句話加深記憶:

* (指標)和 const(常量) 誰在前先讀誰 ;*象徵著地址,const象徵著內容;誰在前面誰就不允許改變。

好吧,讓我們來看這個例子:

int a =3;
int b = 1;
int c = 2;
int const *p1 = &b;//const 在前,定義為常量指標
int *const p2 = &c;//*在前,定義為指標常量 

常量指標p1:指向的地址可以變,但內容不可以重新賦值,內容的改變只能通過修改地址指向後變換。

   

    p1 = &a是正確的,但 *p1 = a是錯誤的。
指標常量p2:指向的地址不可以重新賦值,但內容可以改變,必須初始化,地址跟隨一生。
    p2= &a是錯誤的,而*p2 = a 是正確的。

下面是在Vim編輯器中的除錯結果


上述程式碼在註釋 18行 和 24行 程式碼後才能正確輸出,下圖是正確結果


輸出結果可以看出,對於常量指標p1,改變其地址指向,內容也隨著地址的改變而變化了。

而對於指標常量p2,初始化後地址就固定了,內容可以隨時重新賦值。

對於常量指標p1,我們可以改變它指向的地址,但不能改變指向的內容,如果改變了,就會出錯,下面是18行程式碼取消註釋後編譯器提示的錯誤:


對於指標變數p2,我們可以改變他指向的內容,卻不能改變它指向的地址,如果改變了,就會出錯,下面是24行程式碼取消註釋後編譯器提示的錯誤:


經過上面的介紹,我想大家應該知道常量指標和指標常量的區別了。

相關推薦

《C專家程式設計》:指標陣列的區別(四)

        C語言程式設計新手常聽到的說法之一就是“陣列和指標是相同的”。不幸的是,這是一種非常危險的說法,並不完全正確。一、什麼是宣告,什麼是定義。      注意下面宣告的區別: extern int *x;//宣告x是一個int型別的指標; e

二級指標二維陣列(轉)

一個函式形如: void f(float **p){ /* 想要在函式體中按二維陣列的方式訪問*/     p[1][1] = 0;//c++用vc編譯ok,執行出錯(非法訪問) } float **p; //其實這裡的p並不是一個二位陣列的指標,只不過是一個指向指標的指標 像你這樣訪問肯定是

cookie session 的區別

重復 處理方式 一行 所有 有效 依據 是把 存儲 一個 二者的定義: 當你在瀏覽網站的時候,WEB 服務器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇, 都紀錄下來。當下次你再光臨同一個網站,WEB 服務器會先看看有沒有它上次留下的

PHP中includerequire的區別

for in repl 這不 語句 沒有 16px targe size something 1、概要    require()語句的性能與include()相類似,都是包括並運行指定文件。不同之處在於:對include()語句來說,在執行文件時每次都要進行讀取和評估;

CROSS APPLY OUTER APPLY 區別

0.00 oss 生成 數據 sql 這一 cti ssa 另一個 SQL Server 2005 新增 cross apply 和 outer apply 聯接語句,增加這兩個東東有啥作用呢? 我們知道有個 SQL Server 2000 中有個 cross join 是

Thread.currentThread().getName() this.getName()區別

區別 pac 修改 face 通過 同名 exce splay 情況 Thread.currentThread().getName() 和 this.getName()區別詳解<<Java多線程編程核心技術>>這本書裏說到了這個: Thread.c

JavaScript 中 Property Attribute 的區別

sce 否則 遞歸 tro ole 條件 節點 記錄 could property 和 attribute非常容易混淆,兩個單詞的中文翻譯也都非常相近(property:屬性,attribute:特性),但實際上,二者是不同的東西,屬於不同的範疇。 property是DOM

HashTableHashMap的區別

body 線程安全 serializa javadoc cloneabl 允許 哈希 安全性 rac HashMap是基於哈希表實現的,每一個元素是一個key-value對,其內部通過單鏈表解決沖突問題,容量不足(超過了閥值)時,同樣會自動增長。 HashMap

java中==equalshashcode的區別

style void ted 基本類型 內存 class 存儲 throw rgs 一、相同點 都是用來進行值或對象的比較。 二、不同點 對於“==”而言,對於基本類型(char,byte,short,int,long,float,double

java中==equals的區別

字符 blog 的區別 代碼塊 數組 sss oss 兩種 內存劃分 分析前基礎了解: 一)JVM把內存劃分成兩種:一種是棧內存,一種是堆內存。   ①在函數中定義的一些基本類型的變量和對象的引用變量(變量名)都在函數的棧內存中分配。   ②當在一段代碼塊定義一個變量時

IOSAndroid系統區別

清理 span back 一個 style 沙盒 安裝 最大值 完全 IOS系統(非開源,不可擴展) iphone沙盒機制解釋:應用程序位於文件系統的嚴格限制部分,程序不能直接訪問其他應用程序。 1、iOS的編程語言Objective-C 2、IOS采用的是沙盒運行

cookiesession的區別

這些都是基礎知識,不過有必要做深入瞭解。先簡單介紹一下。 二者的定義: 當你在瀏覽網站的時候,WEB 伺服器會先送一小小資料放在你的計算機上,Cookie 會幫你在網站上所打的文字或是一些選擇, 都紀錄下來。當下次你再光臨同一個網站,WEB 伺服器會先看看有沒有它上次留

HTTP請求方式GETPOST的區別

HTTP有兩部分組成:請求與響應,下面分別整理。 一.HTTP請求 1.HTTP請求格式: <request line> <headers> <blank line> [<request-body>] 在HTTP請

關於jQuery繫結事件onbind的區別

如題,jQuery兩種繫結事件,舉例說明: //對於ul_li的繫結方法 //方法一: $("ul li").bind("click",function(){console.log($(this))}); //方法二: $("ul li").on("click",fun

瀏覽器儲存之Cookie、LocalStorage SessionStorage的區別

Cookie 常用於客戶端與服務端之間的通訊,但是它有本地儲存的功能。 缺點: 儲存量太小,只有4kb 所有http請求都會含cookie,會影響獲取資源的效率 API簡單,需要封裝一下才能用 LocalStorage 和SessionStorage H5問世後

LinuxUnix的區別

很多初學Linux的人幾乎都有相同的疑問——Linux和Unix有啥區別?弄清楚這兩者之間的區別有助於我們對作業系統的瞭解,這篇文章將詳細闡述Linux Unix的區別: Linux和UNIX的最大的區別是——前者是開發原始碼的自由軟體,而後者是對原始碼實行智慧財產權保護的傳統商業軟體。這應該是它們

AIO、BIONIO的區別

IO讀寫時,多路複用機制都會依賴一個事件分離器,負責把源事件的IO分離出來,對應到read/write事件分離器。 事件分離器的兩種模式: 1. Reactor:同步IO 2. Proactor:非同步IO(重疊IO) Reactor 在Rea

變數的定義宣告的區別

感言:我馬上大三了,對計算機也算是有點感興趣,但一直以來我對變數的定義和宣告都很模糊,最開始看書上是這樣講的:定義-->就形如 int a;這就是定義了一個整形變數,然後就說變數的定義只能是一次而宣告卻可以多次,然後就沒,我也問了好幾個老師,他們也都是這樣說的,我在網

棧的區別 ()

轉自:  https://blog.csdn.net/Fiorna0314/article/details/49757195 一、資料結構中的堆和棧        堆和棧在資料結構中是兩種不同的資料結構。 兩者都是資料項按序排列的資

C# Console.Write();Console.WriteLine();區別

Console.Write();和Console.WriteLine();區別詳解: Console.Write();,專業:將指定的字串值寫入標準輸出流。通俗:控制檯輸出,不換行。 示例程式碼: 1 using System; 2 using System.Collectio