const指針和指向常量的指針

先看下面六種寫法:

1. const int p;2. const int *p;3. int const* p;4. int * const p;5. const int * const p;6. int const * const p;

那么我們應該怎么區分上面的寫法到底是指向常量的指針還是const指針(表示指針本身是常量)呢?

一個簡便方法:從由往左讀,遇到p就替換為“p is a”,遇到*就替換為“point to”,其余不變。

下面我們來一個一個看:

1. const int p; // p is a int const. p是一個int型常量 這個很簡單2. const int *p; //p is a point to int const. p是一個指針,指向int型常量。即p是一個指向int型常量的指針。3. int const* p; //與2相同 const int 和 int const 是一樣的意思。《C++ primer》中采用第一種寫法。4. int * const p; // p is a const point to int. p是一個指向int的const指針5. const int * const p; //p is a const point to int const. p是一個指向int型常量的const指針。6. int const * const p; //同5

知道怎么區分const指針和指向常量的指針,我們再來看看它們的定義。

指向常量的指針(point to cosnt)不能用于改變其所指對象的值。比如:

const double pi = 3.14; // pi是一個常量,不能改變它的值const double *cptr = π //cptr指向pi,注意這里的const不能丟,因為普通指針不能指向常量*cptr = 3.33;  //錯誤,試圖改變所指對象的值。不能給*cptr賦值,即不能改變指針所指對象的值

cout << cptr << endl;//輸出cptr的值//雖然不能改變其所指對象的值,但是它可以指向別的常量對象
//這樣的話 指針的值(也就是存放在指針中的那個地址)也會改變 比如:
cosnt double pi2 = 6.28;cptr = &pi2; //正確  *cptr為6.28 

cout << cptr << endl; //cptr的值變了

const指針表示指針本身是一個常量。由于指針是對象,因此就像其他對象一樣,允許把指針本身定為常量。cosnt指針必須初始化,并且一旦初始化,const指針的值就不能改變了。const指針的值到底是什么?其實就是存放在指針中的地址,這個地址是一個對象的地址。

把*放在const前面就表示指針是一個常量,這樣的書寫形式意味著不變的是指針本身的值而不是指向的對象的值(內容)。也就是說,那個地址不能再變了,但是我們可以改變那個地址上存放的內容。比如:

int i = 42;int * cosnt p = &i; //p是一個const指針,不能給p賦值

cosnt int i2 = 44;p = &i2; //錯誤 試圖給p賦值//雖然不能給p賦值,也就是不能改變p的值,但是我們可以通過p改變p所指的對象的內容。比如:*p = 46; //正確 此時i為46

指針本身是一個常量(即const指針)并不意味著不能通過指針修改其所指對象的值,能否這樣做完全依賴于所指對象的類型。比如,

const double pi = 4.4;const double *const pip = &pi; //pip是一個指向常量對象的const指針(還記得文章開頭的方法嗎)。

pip是一個指向常量的常量指針,則不論pip所指的對象值還是pip自己存儲的那個地址都不能改變。相反,上例中的p指向的是一般的非常量整數,所以p可以修改i的值。

完整代碼:

#include <iostream>
using namespace std;int main(int argc, char const *argv[])
{const int b = 11;const int *p2 = &b;  //指向常量的指針 底層const 不能改變p2的所指對象的值 但是可以改變p2的值(即指針的指向)  前提是仍然指向一個常量cout << *p2 << endl; //11cout << p2 << endl;  //0x72fe38const int c = 22;p2 = &c;cout << *p2 << endl; //22cout << p2 << endl;  //0x72fe34地址發生了改變int i = 9;int *const p1 = &i;  //指針是一個常量(即常量指針)頂層const 不能改變p2的值(存放在p2中對象的地址) 但是可以改變對象的內容cout << p1 << endl;  //0x72fe3c 這個地址不會再改變了*p1 = 88;cout << i << endl;  //88cout << *p1 << endl; //88cout << p1 << endl; //0x72fe3creturn 0;
}

對于指針來說,頂層const表示指針本身是一個常量,底層const表示指針所指的對象是一個常量。所以const指針是頂層cosnt,而指向常量的指針是底層const。

?

轉載于:https://www.cnblogs.com/bencai/p/8888760.html

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

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

相關文章

配置SQL Server的身份驗證方式

下面的文章來源于網絡&#xff0c;講的是怎樣配置SQL Server 2005登陸驗證方式&#xff0c;但是內容同樣適用于SQL Server 2008. 配置SQL Server的身份驗證方式 在默認情況下&#xff0c;SQL Server 2005 Express是采用集成的Windows安全驗證且禁用了sa登錄名。為了工作組環境下…

計算機程序設計藝術+第3卷:排序與查找(第二版)pdf

下載地址&#xff1a;網盤下載 《計算機程序設計藝術排序和查找(第3卷)(第2版)》內容簡介&#xff1a;這是對第3卷的頭一次修訂&#xff0c;不僅是對經典計算機排序和查找技術的最全面介紹&#xff0c;而且還對第1卷中的數據結構處理技術作了進一步的擴充&#xff0c;通盤考慮了…

數據結構與算法--5.Python實現十大排序算法

文章目錄0. 相關概念一. 冒泡排序二. 選擇排序三. 插入排序四. 希爾排序五. 快速排序六. 歸并排序七. 其他0. 相關概念 穩定&#xff1a;如果a原本在b前面&#xff0c;而ab&#xff0c;排序之后a仍然在b的前面。不穩定&#xff1a;如果a原本在b的前面&#xff0c;而ab&#xf…

No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 問題

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 maven run as --install 時出錯&#xff0c;提示信息如下&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:m…

spring cloud(九):各組件常用配置參數

1、Eureka的常用配置Eureka Server端eureka.server.enable-self-preservation # 設為false&#xff0c;關閉自我保護eureka.server.eviction-interval-timer-in-ms # 清理間隔&#xff08;單位毫秒&#xff0c;默認是60*1000&#xff09;eureka.environmentdev #指定環境eureka…

JSON與XML的區別比較

1.定義介紹 (1).XML定義 擴展標記語言 (Extensible Markup Language, XML) &#xff0c;用于標記電子文件使其具有結構性的標記語言&#xff0c;可以用來標記數據、定義數據類型&#xff0c;是一種允許用戶對自己的標記語言進行定義的源語言。 XML使用DTD(document type defini…

ajax傳遞數組:屬性traditional設置

jQuery.ajaxSettings.traditional true; $.post("",function(){});轉載于:https://www.cnblogs.com/HansZimmer/p/9334006.html

Python面試題總結(9)--高級特性

文章目錄1. 函數裝飾器有什么作用&#xff1f;請列舉說明&#xff1f;2. Python 垃圾回收機制&#xff1f;3. 魔法函數 _call_怎么使用?4. 如何判斷一個對象是函數還是方法&#xff1f;5. classmethod 和 staticmethod 用法和區別6. Python 中的接口如何實現&#xff1f;7. Py…

I/O流講解

本文來自&#xff1a;曹勝歡博客專欄&#xff1a;http://blog.csdn.net/csh624366188 在軟件開發中&#xff0c;數據流和數據庫操作占據了一個很重要的位置&#xff0c;所以&#xff0c;熟悉操作數據流和數據庫&#xff0c;對于每一個開發者來說都是很重要的&#xff0c;今天就…

Spring Boot入門(9)網頁版計算器

介紹 在寫了前八篇Spring Boot項目的介紹文章后&#xff0c;我們已經初步熟悉了利用Spring Boot來做Web應用和數據庫的使用方法了&#xff0c;但是這些僅僅是官方介紹的一個例子而已。 ??本次分享將介紹筆者自己的一個項目&#xff1a;網頁版計算器&#xff0c;以這兩篇博客…

shell編程基礎(七): 處理文件命令sed與awk

一、sed&#xff08;以行為單位處理文件&#xff09; sed意為流編輯器&#xff08;Stream Editor&#xff09;&#xff0c;在Shell腳本和Makefile中作為過濾器使用非常普遍&#xff0c;也就是把前一個程序的輸出引入sed的輸入&#xff0c;經過一系列編輯命令轉換為另一種格式輸…

數據結構與算法--6.二分查找

文章目錄一. 二分查找二. 代碼實現一&#xff1a;使用遞歸三. 代碼實現二&#xff1a;非遞歸一. 二分查找 二. 代碼實現一&#xff1a;使用遞歸 def binary_search(alist, item):"""二分查找&#xff1a;使用遞歸"""n len(alist)if n > 0:m…

SpringMVC請求處理流程、springMVC工作流程

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 頁面請求到來 --> 前端控制器&#xff08;DispatcherServlet&#xff09;收到請求&#xff0c;請求 處理映射器&#xff08;Hanle…

Android的TextView在顯示文字的時候,如果有段中文有英文,有中文,有中文標點符號,你會發現,當要換行的時候遇到中文標點, 這一行就會空出很多空格出來...

一、問題描述&#xff1a; Android的TextView在顯示文字的時候&#xff0c;如果有段中文有英文&#xff0c;有中文&#xff0c;有中文標點符號&#xff0c;你會發現&#xff0c;當要換行的時候遇到中文標點&#xff0c; 這一行就會空出很多空格出來。原因是&#xff1a; 1&…

什么是IDE

集成開發環境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09;是用于提供程序開發環境的應用程序&#xff0c;一般包括代碼編輯器、編譯器、調試器和圖形用戶界面等工具。集成了代碼編寫功能、分析功能、編譯功能、調試功能等一體化的開發軟件服務…

vue 學習

http://jspang.com/ vue 學習 vue 學習 轉載于:https://www.cnblogs.com/qianjin888/p/9342031.html

策略模式-Strategy Pattern

解決問題 將算法按照策略或場景封裝起來&#xff0c;以方便按照不同的場景執行不同的策略。它很好的解決了通過if...else 來決策行為而帶來的代碼和邏輯復雜性。 應用場景 一個經常被拿來舉例的場景是收銀員收銀場景&#xff1a;它需要根據不同的場景&#xff08;是否為會員、有…

ssm框架下 tiles框架 的使用

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 tiles框架的工作 在springMVC工作流程中屬于視圖解析器 解析視圖這一步。算是視圖解析器的一個插件&#xff0c;作了視圖解析這步的一部…