const修飾指針和引用的用法【轉貼】

***************************************************

更多精彩,歡迎進入:http://shop115376623.taobao.com

***************************************************


const修飾的指針會額外的占內存嗎?

仍然是4,不會占額外的內存。如果確定不會修改的話,加上 const 可以防止被誤修改,這樣可避免一些錯誤。而且有利于 編譯器 幫組優化程序


const修飾指針引用的用法,

對于初學C++的人直是諱莫如深,不知所云.一旦你了解了其用法,一切便不值一哂了.下面我為讀者一一釋疑:?

?? 大致說來其可分為三種情況: const修飾指針,const修飾引用,const修飾指針的引用.?
1.const修飾指針?
?? const修飾指針又可分為三種情況:?
???? const修飾指針本身?
???? const修飾指針所指的變量(或對象)?
???? const修飾指針本身和指針所指的變量(或對象)?
(1).const修飾指針本身?
????這種情形下,指針本身為常量,不可改變,任何修改指針本身的行為都是非法的.例如:?
const int a = 1;?
const int b = 2;?
int i = 3;?
int j = 4;?
int* const pi = &i; //ok, pi的類型為int* const , &i的類型為int* const ? //演變:int *p ? ?-> ? int * constp
int* const pi = &a; //error, pi的類型為int* const, &a的類型為const int* const?
pi = &j; //error, 指針是常量,不可變?
*pi = a; //ok, *pi并沒有限定是常量 ,可變?
????由此看出,pi是常量,常量在初始化和賦值時,類型必須嚴格一致。也就是?
const修飾指針本身時,=號兩邊的變量類型必須嚴格一致,否則不能匹配。?
(2).const修飾指針指向的變量(或對象)?
????此種情形下,通過間接引用指針不可改變變量的值,假設指針為p,則*p不可變,下面以例子說明:?
const int *pi = &a;?
//or int const *pi = &a;?
//兩者毫無二致,不過BS喜歡前者,這也沒什么技術上的優劣之分,也就是說const int與int const可以互換.建議大家熟?
//悉這兩種形式,為簡潔便,以后統統用前者.?
//ok, const并不修飾指針本身,pi對賦值類型?
//沒要求 ,但pi是int*型指針,所以所賦的必須是個地址值。?
const int *pi = &i; //ok ,pi可賦值常量的地址,又可賦變量的地址?
const int *pi1 = &a;?
const int *pi = pi1; //ok?
*pi = j; //error,*pi 不可變,不能更改指針的間接引用形式?
pi = &j; //ok,pi可變?
pi = &b; //ok,pi可變?
pi++; //ok?
--pi; //ok?
???? 由此可見,pi是變量,可以賦值常量和變量的值,正如一個整型變量可賦整型數和整型變量一樣.const修飾的不是指針本身,而是其間接引用,=號兩邊的類型不必嚴格匹配,如:const int* pi = &a;中,pi的類型為int*,而&a的類型為const int* const,只要其中含有int* 就可以。又如:const int *pi = &j;中,pi的類型為int*,而&j的類型為int* const,它向pi賦值并無大礙。?
(3)const修飾指針本身指針所指的變量(或對象) 【前面兩者的綜合】
???? 設有指針p,此種情形下,p和*p都不可變.舉例如下:?
const int* const pi = &a;?
//or int const* const pi = &a;?
//將const pi看作一體,就與(2)所述相同,只是要求pi必須為const,正如上所說,=號兩邊的類型不必嚴格匹配,但必須含有int*, &a的類型為const int* const,含有int*, 所以可以賦值。?
const int* const pi = &i; //ok, &i類型為int* const,含有int*, 可賦值。?
const int *pi1 = &j;?
const int *const pi = pi1; //ok,??pi1類型為int*?
pi = &b; //error, pi不可變?
pi = &j; //error, pi不可變?
*pi = b; //error, *pi不可變?
*pi = j; //error, *pi不可變?
pi++; //error ,pi不可變?
++i; //ok, =號右邊的變量(或對象)與所修飾的變量無關?
a--; //error, a為const?
???? 這種情況,跟以上兩種情形有聯系。對const int* const pi = &a;我們可以這樣看:const int*( const pi )= &a;(僅僅是表達需要),將const pi看作一體,就與上述分類(2)符合。只要含有int*便可.?

2.const修飾引用?
????這種情況比較簡單,沒有象修飾指針那樣繁復,因為引用和引用對象是一體的,所以引用被const修飾只有一種類型。?
const修飾引用,引用本身不可變,但引用的變量(或對象)可以改變.例如:?
const int& ri = a; //or int const & ri = a; ok, ri 本身是常量,引用不區分類型?
const int& ri = i; //ok,引用不區分類型 ? ?//演變:int & ri = i ? ?-> ? ? constint & ri = i
ri++; //error, ri為常量,不可變?
i++; //ok,=右邊的變量與引用無關?
ri=b; //error, ri為常量?
i=j; //ok,=右邊的變量與引用無關?
int & const ri = i; //error,不存在這種形式,沒有意義?

3.const修飾指針的引用?
????引用只是個別名,這里與修飾指針類似,又分為三種情況:?
(1)?
???? 先給個例子:?
const int *pi = &a;?
const int *&ri = pi;?
//or int const *&ri = pi;?
????引用是引用對象的別名,正因為如此,ri是pi的別名,所以ri的類型必須與pi完全一致才行。這里pi的類型為int*,ri的類型也為int*,賦值可行。若const int *&ri = &a;正不正確?分析一下就知曉。ri類型為int*,&a的類型則為const int* const不匹配。?
const int *&ri = &i; //error,類型不匹配,一為int*,一為int* const?
ri = &a; //ok?
ri = &i; //ok?
const int *pi1=&a;?
const int *pi2=&i;?
ri = pi1; //ok?
ri = pi2; //ok?
*ri = i; //error?
*ri = a; //error?
???? 注意這與1-(2)的區別.?
(2)?
???? 用例子說明:?
int *const &ri = &i;?
????去掉ri左邊的&號,則為int *const ri,因為ri是別名,故ri的類型應與賦值的數類型一致,ri類型為int *const,&i為int *const,可以這么做.?
int *const &ri = pi; //error,類型不合,一為int *const ,一為int *?
int *const &ri = &a; //error,類型不合,一為int *const,一為const int* const?
(*ri)++; //ok?
i++; //ok?
ri = &i; //error?
?? 這種情況下,ri為常量,不可更改.?
(3)?
???? 用例子說明:?
const int* pi = &j;?
const int* const &ri = pi; //or int const * const &ri = pi;ok?
const int* const &ri = &i; //ok?
???? ri是pi的別名,pi的類型應與ri一致。拿掉&,得const int* const ri ,把const??ri看作一體,很容易得出ri的類型信息,就象前面2-(3)所討論的一樣,可以得到賦給ri的只要含有類型int* 即可。pi的類型為int*,&i的類型為int* const ,可以這么做.?
const int * const &ri = &a; //ok?
ri++;??//error?
*ri = 6;??//error?
????言盡于此,希望對初學者有所助益!?

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

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

相關文章

調整linux系統時區

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 好吧,使用tzselect又靠譜些,使用前把/etc/localtime刪除了。 執行上前那個告訴我文件重新了,所以就沒有搞了轉載于:https://www.cnblogs.com/hark0623/p/4807426.html

stm32c語言設計以及注釋,13個基于STM32的經典項目設計實例,全套資料~-嵌入式系統-與非網...

STM32單片機現已火遍大江南北,各種教程資料也是遍布各大網站論壇,可謂一抓一大把,但大部分都差不多。今天總結了幾篇電路城上關于STM32 的制作,不能說每篇都是經典,但都是在其他地方找不到的,很有學習參考意…

memcpy,strcpy,strncpy

*************************************************** 更多精彩,歡迎進入:http://shop115376623.taobao.com *************************************************** memcpy c和c使用的內存拷貝函數.從源src所指的內存地址的起始位置開始拷貝n個字節…

二維數組聯通子數組和最大

題目要求: 返回一個二維整數數組中最大聯通子數組的和。輸入一個二維整形數組,數組里有正數也有負數。文件輸出。思路:和之前的動態規劃相識,把二維數組轉換為一維數組,先求每一個列的子數組和最大,最后在用正數就加&a…

c語言如何給變量加鎖,C語言互斥鎖-條件變量實現公共緩存區數據讀寫

#include char buffer[128];int has_data0;pthread_mutex_t mutex;pthread_cond_t cond;pthread_cond_t cond2;void read_buf(void){do{pthread_mutex_lock(&mutex);//鎖定互斥鎖if(has_data0){/*阻塞線程,等待另外一個線程發送信號,同時為公共數據區解鎖*/pthr…

view-activity跟控件在onkey事件上的傳遞關系

android 中Activity跟View對于鍵盤的監聽,主要有以下幾個方法 //按鍵按下 public boolean onKeyDown(int keyCode, KeyEvent event) {} //按鍵彈起 public boolean onKeyUp(int keyCode, KeyEvent event) {} //常按 public boolean onKeyLongPress(int keyCode, Ke…

PMP考試的過與不過

*************************************************** 更多精彩,歡迎進入:http://shop115376623.taobao.com *************************************************** 我在一年多時間里參加了三次PMP考試,前兩次都失敗,直到第三次才…

JPA一對多循環引用的解決

說是解決,其實不是很完美的解決的,寫出來只是想記錄一下這個問題或者看一下有沒有哪位仁兄會的,能否知道一二。 下面說說出現問題: 問題是這樣的,當我查詢一個一對多的實體的時候,工具直接就爆了&#xff0…

太原理工大學c語言課程設計報告,[太原理工大學C語言實驗報告.doc

[太原理工大學C語言實驗報告本科實驗報告課程名稱: 程序設計技術B實驗項目:實驗地點: 明向校區軟件學院機房專業班級: 學號:學生姓名:指導教師: 呼克佑2014年 12月 日實驗名稱 實驗一 C語言的運…

網頁常用動態效果--懸浮廣告

關鍵在于動態獲取滾動坐標值 測試滾動事件 $(window).scroll(function(){ console.log($(window).scrolltop()); }) 獲取三個高度:窗口高度,盒子高度以及滾動坐標值,將廣告盒子設置為絕對定位,當鼠標滾動時,其top值為滾…

打印英文年歷C語言函數,C語言打印年歷

voidshow_year(int year){inti,j,k,t,n;                           // 用來輔助計數int table[24][21] {0};                     // 年歷數組int month_day[12] {31,28,31,30,31,30,31,31,30,31,30,31}; // 每月上限天數i…

ubuntu14.04配置caffe

ubuntu 14.04 64bit 安裝 請自行Google安裝&#xff0c;并修改源。 cuda 7.5 安裝 cuda7.5下載&#xff0c;選擇ubuntu 14.04的deb包下載安裝一些可能的依賴 sudo apt-get install linux-headers-$(uname -r) build-essential 安裝cuda sudo dpkg –i cuda-repo-<distro>…

iOS開發API常用英語名詞

iOS開發API常用英語名詞 0. indicating 決定 1.in order to 以便 2.rectangle bounds 矩形尺寸 3.applied 應用 4.entirety 全部 5.technique 方法 6.truncating 截短 7.wrapping 換行 8.string 字符串 9.familiar style 簡體 10.The styled text 主題樣式 11.Constants 常量 …

Win10 IIS本地部署網站運行時圖片和樣式不正常?

后期會在博客首發更新&#xff1a;http://dnt.dkill.net 異常處理匯總-服 務 器 http://www.cnblogs.com/dunitian/p/4522983.html 啟用關閉win功能&#xff0c;開啟一下靜態內容 收工~

設置IIS會話過期時間

打開默認網站----雙擊ASP--展開會話屬性---更改超時時間-轉載于:https://www.cnblogs.com/genesis/p/4816128.html

89c51單片機匯編語言,AT89C2051時鐘程序——MCS51單片機匯編程序

;; AT89C2051時鐘程序 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;定時器T0、T1溢出周期為50MS&#xff0c;T0為秒計數用&#xff0c; T1為調整時閃爍用&#xff0c;;P3.7為調整按鈕&#xff0c;P1口 為字符輸出口&#xff0c;采用共陽顯示管。;;;;;;;;;;;;;;;;;;;;;;;;;;;;…

c語言結構體指針初始化

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 記得上周在飯桌上和同事討論C語言的崛起時&#xff0c;講到了內存管理方面 我說所有指…

WWDC 2013 Session筆記 - iOS7中彈簧式列表的制作

這是我的WWDC2013系列筆記中的一篇&#xff0c;完整的筆記列表請參看這篇總覽。本文僅作為個人記錄使用&#xff0c;也歡迎在許可協議范圍內轉載或使用&#xff0c;但是還煩請保留原文鏈接&#xff0c;謝謝您的理解合作。如果您覺得本站對您能有幫助&#xff0c;您可以使用RSS或…

H5學習之旅-H5列表(8)

列表的基本語法 ol&#xff1a;有序列表 ul&#xff1a;無序列表 li&#xff1a;列表項 dl&#xff1a;列表 dt&#xff1a;列表項 dd&#xff1a;列表描述 常用列表 1.無序列表&#xff1a;使用標簽 ul&#xff0c;li 屬性&#xff1a;disc&#xff08;默認實心圓&#xff09;…

c語言 文件夾是否純真,C語言面試題大匯總之華為面試題(轉)

1、局部變量能否和全局變量重名&#xff1f;答&#xff1a;能&#xff0c;局部會屏蔽全局。要用全局變量&#xff0c;需要使用 ":: "局部變量可以與全局變量同名&#xff0c;在函數內引用這個變量時&#xff0c;會用到同名的局部變量&#xff0c;而不會用到全局變量。…