欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

<四>2:掌握Const 與一二級(jí)指針結(jié)合應(yīng)用

C++中
Const修飾的量叫常量,與普通變量的區(qū)別是什么?
C++中有兩點(diǎn)
1:編譯方式不同,在編譯的過程中,所有在程序中出現(xiàn)名字的地方都會(huì)被初值替換掉
2:不能作為左值了

創(chuàng)新互聯(lián)建站是專業(yè)的克山網(wǎng)站建設(shè)公司,克山接單;提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行克山網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

const修飾的量常出現(xiàn)的使用錯(cuò)誤有
1:常量作為左值修改值 (因?yàn)檫@種方式可以直接修改常量的值)
2:把常量的地址泄漏給一個(gè)普通的指針或普通的引用變量 (因?yàn)檫@種方式可以間接修改常量的值如下示例1代碼)
示例1:
const int a=10;
int p =&a; //p=20; 編譯報(bào)錯(cuò) 不能將 const int*(整型常量的地址) 賦值給 int *(普通的int指針)

const 和一級(jí)指針結(jié)合方式有如下種類
C++的語言規(guī)范: const修飾的是離他最近的類型

const int *p;
p指針指向的內(nèi)容不能再被修改,但是p可以指向任意的int類型的內(nèi)存

int const *p;
這種方式同上

int * const p;
const 修飾的類型是 int *,修飾的表達(dá)式是p, 即 p的值(也是地址)不能被修改了,即p不能再指向其他內(nèi)存地址了,但是p所指向的那個(gè)內(nèi)存的值得內(nèi)容可以修改 即 *p=200;

cont int * const p;
const p 是指 p不能再指向其他內(nèi)存地址了, const int * 是指 p指向的內(nèi)容不能在修改了.

示例2:如下
const int b=10;
const int * p=&b;(OK 編譯通過)
int *pp=&b (NOT OK, 相當(dāng)于將 const int * 轉(zhuǎn)為 int *)

int c=10;
int *p1=&c; (OK)
const int *p2=&c; *(OK 相當(dāng)于將 int * 轉(zhuǎn)為 const int )
int * const p3=&c; (OK)


int * p=nullptr;
int * const p1=nullptr;
cout<<typeid(p)<<endl; // 結(jié)果是 int *
cout<<typeid(p1)<<endl;// 結(jié)果是 int *
**結(jié)論:如果const 右側(cè)沒有指針即沒有*的話,那const不參與類型, 即 int * const p1, 這個(gè)const 不參與類型, p1的類型仍然是 int * 見下面代碼
所以示例3:
int c=10;
int * const p3 = &c; (OK, int * 轉(zhuǎn)為 int * const 根據(jù)上面的結(jié)論 const 不參與類型, 其實(shí)還是 int * 轉(zhuǎn)為 int *)


示例4:
int x=100;
const int *p=&x;
int *p1=p; // 錯(cuò)誤 相當(dāng)于 const int * 轉(zhuǎn)為 int * 是不可以的


const和二級(jí)指針的結(jié)合

const 與二級(jí)指針的結(jié)合分成以下幾種
const int ** p
根據(jù)C++編程規(guī)范,const 修飾離他最近的類型, const 修飾的類型是int ,修飾的表達(dá)式是 **p , 是指 **p的值不能被修改

int * const * p
const 修飾的類型是 int*, 修飾的表達(dá)式是 *p , 指 *p 的值不能被修改, p的值可以修改 **p 的值也可以修改

int ** const p;
const 修飾的類型是 int** , 修飾的表達(dá)式是p ,指p的值不能被修改, *p的值可以修改,**p的值也可以修改

看以下示例是否能通過編譯
示例5:
int a =10;
int *p =&a;
const int ** q =&p; (這句話無法通過編譯)
上面一行代碼相當(dāng)于 int ** 轉(zhuǎn)成 const int **
怎么理解呢?
如果
int a=10;
int *p=&a;
const int ** q =&p;
上面的代碼可以編譯通過

首先 q 和p指向的是同一塊內(nèi)存地址
如果有
const int b=200;
q =&b;
上面這兩行代碼,b是const int常量, 現(xiàn)在我們將b的地址放入
q中,即
q=&b,
由于*q和p是同一塊內(nèi)存地址,那么我們是不是就把一個(gè)常量的地址即b的地址,就暴露給了一個(gè)普通指針p呢?
這將會(huì)造成通過普通指針p很容易修改常量b的值了,所以const int ** q = &p; 是不可以的。那么怎么解決呢?
第一種辦法:
直接把int *p 加上const不就可以了嗎?不就限制了p修改常量的值了嗎?
第二種辦法:
int a=10;
int *p=&a
const int * const *q=&p;
我就不允許 *q =&b, 不就堵住了把一個(gè)常量的地址放入普通指針的口了嗎?


示例6:
int a =10;
const int *p =&a;
int ** q =&p; (這句話無法通過編譯)
上面一行代碼相當(dāng)于 const int ** 轉(zhuǎn)成 int ** 更加不可以了
如何理解?
const int *p =&a 相當(dāng)于一級(jí)指針P已經(jīng)做承諾,我指向的內(nèi)容是不可變的,通過p,是不允許修改指向值得內(nèi)容的
那么 int ** q =&p ,如果可以通過編譯的話,那么我可以 **q 去修改a的值了,那不是讓 一級(jí)指針的const修飾了個(gè)寂寞嗎?

同理
int **q = int * const *p 可以轉(zhuǎn)嗎?

int * const *p const 修飾的類型是int *,修飾的表達(dá)式是 *p,是指 p所指向的內(nèi)容是不允許修改的,
如果上面的轉(zhuǎn)換可以,那么 **q 是不是可以輕易修改 最底層的值了呢?打破了上面的 的限制,所以結(jié)論是不可以的

int *const *q =int ** 可以轉(zhuǎn)嗎?

int * const *q 只是表達(dá)了 *q 的值是不能修改了而且,所以可以轉(zhuǎn)

網(wǎng)頁名稱:&lt;四&gt;2:掌握Const 與一二級(jí)指針結(jié)合應(yīng)用
標(biāo)題來源:http://chinadenli.net/article44/dsoieee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、域名注冊(cè)外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站策劃網(wǎng)站建設(shè)、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)