C++常量指針,指針常量,指向常量的常指針詳解
什么是指針
指針就是指向變量在內(nèi)存中的地址
數(shù)據(jù)是存放在內(nèi)存中的,每一個(gè)變量都有一個(gè)內(nèi)存地址,假設(shè)是一個(gè)int類型變量a,占4個(gè)字節(jié)的內(nèi)存區(qū),那么在內(nèi)存中如果是小端方式存儲(chǔ),我們創(chuàng)建指針p,把a(bǔ)的地址賦值給p,就是把a(bǔ)的首地址0x1100賦值給指針p,這個(gè)時(shí)候p的值就是變量a在內(nèi)存中的首地址
int a =10; int*p; p=&a; //把a(bǔ)的首地址賦值給P
也就是說(shuō)指針的值是這塊內(nèi)存區(qū)域的首地址
內(nèi)存地址
內(nèi)存是一個(gè)很大的,線性的字節(jié)數(shù)組,每一個(gè)字節(jié)都是固定8個(gè)二進(jìn)制位組成,計(jì)算機(jī)對(duì)每個(gè)內(nèi)存單元都進(jìn)行了編號(hào),這個(gè)編號(hào)就稱為內(nèi)存地址,地址決定了內(nèi)存單元在內(nèi)存中的位置
指針?biāo)純?nèi)存
在32位系統(tǒng)中,處理器一次能處理的最大位數(shù)是2的32次方 ,也就是一次處理4個(gè)字節(jié)的內(nèi)存數(shù)據(jù),哪么指針的長(zhǎng)度也就是4個(gè)字節(jié)。
在64位系統(tǒng)中,處理器一次能處理的最大位數(shù)是2的64次方 ,也就是一次處理8個(gè)字節(jié)的內(nèi)存數(shù)據(jù),哪么指針的長(zhǎng)度也就是8個(gè)字節(jié)。
32位系統(tǒng)指針4個(gè)字節(jié) 64位系統(tǒng)8個(gè)字節(jié)
const 變量
const 是 constant 的縮寫,本意是不變的,不易改變的意思
也就是說(shuō)使用const修飾的變量,其值是不允許改變的
const int a = 7; int b = a; // 正確 a = 8; // 錯(cuò)誤,不能改變
指針常量,常量指針和指向常量的指針
在了解了上面的基礎(chǔ)知識(shí)之后,我們來(lái)看一下什么是指針常量,常量指針和指向常量的指針
首先說(shuō)一下怎么快速的記住他們的區(qū)別,只需要按照命名的順序來(lái)讀,就可以很好地記憶
比方說(shuō):
int * const p =&a;
首先是一個(gè)指針int * , 然后一個(gè)const常量 那么p就是指針常量
const int *p=&a;
首先是一個(gè)const常量, 然后一個(gè)指針int * 那么p就是常量指針
是不是很好記憶
指針常量
int * const p =&a;
特點(diǎn):指針的指向不可以修改,指針指向的內(nèi)存的值可以修改
因?yàn)閏onst的功能就是限定不可以修改,所以我們看到指針常量是先有了int *指針,再有的const修飾p 所以p的值(指向的內(nèi)存地址) 是不可以修改的
也就是const限制的是指針p的值,但是沒(méi)有限定p指向的內(nèi)存地址里的數(shù)據(jù),所以內(nèi)存的數(shù)據(jù)可以修改
舉例:
int a=10; int * const p =&a; //定義指針常量,指向int a的地址 *p = 20; //正確,指向的內(nèi)存地址中的數(shù)據(jù)可以修改 p=&b; //錯(cuò)誤,指向的內(nèi)存地址不可以修改
箭頭是指針指向的內(nèi)存值,是不可以修改的,但是指向的內(nèi)存地址中的數(shù)據(jù)可以修改
常量指針
const int *p=&a;
特點(diǎn): 指針的指向可以修改,但是指針指向的值不可以修改。
常量指針,首先要是常量。就是指向的值要是一個(gè)常量,但是指向的內(nèi)存地址不做限制
int a=10; int b=10; const int *p=&a; //定義常量指針,指向int a的地址 *p = 20; //錯(cuò)誤,指向的內(nèi)存地址中的數(shù)據(jù)不可以修改 p=&b; //正確,指向的內(nèi)存地址可以修改
箭頭是指針指向的內(nèi)存值,是可以修改的,但是指向的內(nèi)存地址中的數(shù)據(jù)要和之前的一致
指向常量的常指針
const int const *p=&a;
特點(diǎn): 指針的指向不可以修改,指針指向的值也不可以修改。
兩個(gè)const限制,一旦指向之后就不可以做修改了
int a=10; int b=10; const int const *p=&a; //定義指針常量,指向int a的地址 *p = 20; //錯(cuò)誤,指向的內(nèi)存地址中的數(shù)據(jù)不可以修改 p=&b; //錯(cuò)誤,指向的內(nèi)存地址不可以修改
空指針、野指針
空指針就是指向地址為空的指針
注意:空指針指向的內(nèi)存是不可以訪問(wèn)的
//-------空指針-------// int *p4 = NULL; //cout << *p4 << endl; //運(yùn)行Error,使用指針時(shí)必須先判斷是否空指針
野指針是指針指向了一個(gè)隨意的內(nèi)存地址,如果使用,會(huì)造成不可預(yù)知的內(nèi)存錯(cuò)誤
//-------野指針(懸浮、迷途指針)-------// int *p5 =0x1100; //任意賦值的野指針 //cout << *p5 << endl; //運(yùn)行Error int *p6 = new int(5); delete p6; //刪除p6的指向 p6 = NULL; //一定要有這一步,否則p6會(huì)隨機(jī)的指向一個(gè)地址
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01C++使用cuBLAS加速矩陣乘法運(yùn)算的實(shí)現(xiàn)代碼
這篇文章主要介紹了C++使用cuBLAS加速矩陣乘法運(yùn)算,將cuBLAS庫(kù)的乘法運(yùn)算進(jìn)行了封裝,方便了算法調(diào)用,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧2021-09-09詳解C++編程中類的成員變量和成員函數(shù)的相關(guān)知識(shí)
這篇文章主要介紹了C++編程中類的成員變量和成員函數(shù)的相關(guān)知識(shí),是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09Java?C++題解leetcode1598文件夾操作日志搜集器
這篇文章主要為大家介紹了Java?C++題解leetcode1598文件夾操作日志搜集器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09C/C++動(dòng)態(tài)分配與釋放內(nèi)存的區(qū)別詳細(xì)解析
以下是對(duì)C與C++中動(dòng)態(tài)分配與釋放內(nèi)存的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09C語(yǔ)言實(shí)現(xiàn)考試報(bào)名管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)考試報(bào)名管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06