最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中const,指針和引用的關(guān)系

 更新時(shí)間:2022年01月12日 16:37:07   作者:悲傷土豆拌飯  
這篇文章主要為大家介紹了C語言的const,指針和引用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

const 與指針

我們寫一段代碼來探究以下

int a = 10, b = 20;
int* p1 = &a;
*p1 = 100;
p1 = &b;
const int* p2 = &a;
int const* p3 = &a;
int* const p4 = &a;
const int* const p5 = &a;

在上面 const int* p2;int const* p3= &a;是等價(jià)的

const在星號(hào)的左邊,我們的const修飾的是指向能力,也就是說我們可以改變p2的自身值,但是不能修改 *p2 的值;

int x = *p2;
*p2 = 100; // err 是錯(cuò)誤的
p2 = &b; //是正確的

const在星號(hào)的右邊,我們p4自身值不能改變,但是可以改變 *p4 的值

int x = *p4;
*p4 = 100; // 是正確的
p4 = &b; //err 是錯(cuò)誤的

而p5既不能改變自身值也不可以改變 *p5 的值

我們現(xiàn)在看下面的代碼,來探討哪一句正確哪一句錯(cuò)誤

int a = 10,b = 20;const int *p = &a;    *p 不能改int *s0 = p;    使得 *p 可改 const int *s1 = p;  *p不可改int * const s2 = p;   *p可改 s2 不可改const int * const s3 = p;*p不可改 s3 不可改

我們對(duì)const int* p = &a;分析,可以看出const修飾使得 *p 不可以修改;繼而分析下面的代碼是否會(huì)對(duì) *p 產(chǎn)生修改

首先我們可以看出我們的 s0 s1 s2 s3 都等于 p 繼而 *s1 *s2 *s3 *p 都是a,我們之前提到過能力可以收縮,而不可以擴(kuò)展;

1.s0等價(jià)于p,而我們對(duì)*s0可以進(jìn)行修改,繼而是錯(cuò)誤的;

2.const修飾 *s1,所以我們無法修改 *s1,可以修改s1,繼而是正確的;

3.cosnt修飾s2,我們可以修改*s2,而不能修改s2,所以是錯(cuò)誤的;

4.我們既不可以修改s4也不可以修改 *s4 ,所以是正確的

我們再來看這樣一段代碼,這次我們將對(duì)p進(jìn)行const修飾

int a = 10,b = 20;
int * const p = &a;     p不能改
int *s0 = p;			  	s0可改 *s0 == *p 可改
const int *s1 = p;		  	*s1 不可改 s1可改 
int * const s2 = p;		  	s2不可改 *s2可改
const int * const s3 = p; 	s3不可改 *s3不可改

我們對(duì)int* const p = &a;分析,這次我們的const修飾p,使得p的值不能修改,而 *p 可以修改,接著分析下面的代碼

首先于上面一樣, s0 s1 s2 s3 都等于 p 繼而 s1 s2 s3 p 都是a

1.s0 與 p相等,我們可以修改*p 可以修改s0,但是對(duì)p并沒有進(jìn)行修改,所以是正確的

2.const修飾 *s1,我們不能修改 *s1,可以修改s1,與p無關(guān)所以是正確的

3.const修飾 s2 ,我們不能修改 s2,可以修改*s2,與p無關(guān)所以是正確的

4.這里我們同樣既不可以修改 s3,也不可以修改 *s3,同樣與p無關(guān),所以是正確的

如果我們通過強(qiáng)制轉(zhuǎn)換使得通過常量地址改變該值

int main()
{
	const int a = 10;
	int b = 0;
	int *p = (int*)&a;
	*p = 100;
	b = a;
	cout<<"a="<<a<<"b="<<b<<"*p="<<*p<<endl;
}

對(duì)于c++,我們產(chǎn)生的結(jié)果為a=10,b=10,*p=100,對(duì)于b=a,依舊給b賦值的是10

在這里插入圖片描述

造成這樣的原因?qū)嶋H上是因?yàn)镃++編譯會(huì)將常量a進(jìn)行數(shù)值替換,繼而b=a變成了b=10,C++對(duì)于常變量當(dāng)作常量

在這里插入圖片描述

當(dāng)使用c語言編譯這段代碼

int main()
{
	const int a = 10;
	int b = 0;
	int *p = (int*)&a;
	*p = 100;
	b = a;
	printf("a=%d b=%d *p=%d\n",a,b,*p);
	return 0;
}

得到的值為a=100,b=100,*p=100

const 與引用

我們寫一段代碼來看看const 與引用的關(guān)系

int a = 10,b = 20;
int *p = &a;
int *s = p;
int *&pref = p;  //給p起了一個(gè)別命pref
int &*pref = p;  //錯(cuò)誤?。?! 

在這里插入圖片描述

int &*pref = p;是錯(cuò)誤的,該代碼是一個(gè)指針指向的是一個(gè)引用,是不允許編譯通過的,因?yàn)樵谡Z法規(guī)則上引用不具有地址,即使引用可以進(jìn)行取地址,但是是不容許這樣做的,也就是我們可以定義一個(gè)引用去引用指針,而不能定義一個(gè)指針去指向引用

const 與指針、引用

我們在寫一段代碼詳細(xì)探討

int a = 10;
int *s = &a;
int *&p1 = s;
const int *&p2 = p;
int * const &p3 = p;
int * & const p4 = p;

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C++利用GPAC實(shí)現(xiàn)生成MP4文件的示例代碼

    C++利用GPAC實(shí)現(xiàn)生成MP4文件的示例代碼

    GPAC主要針對(duì)學(xué)生和內(nèi)容創(chuàng)作者,代表了一個(gè)跨平臺(tái)的多媒體框架,開發(fā)人員可以使用它在?LGPL?許可下制作開源媒體。本文就來用GPAC實(shí)現(xiàn)生成MP4文件,感興趣的可以了解一下
    2023-02-02
  • 基于Qt實(shí)現(xiàn)日志打印系統(tǒng)

    基于Qt實(shí)現(xiàn)日志打印系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何利用Qt開發(fā)一個(gè)日志打印系統(tǒng),可以實(shí)現(xiàn)打印日志按日期、大小保存,過期刪除,窗口實(shí)時(shí)顯示日志,網(wǎng)絡(luò)傳輸日志遠(yuǎn)程調(diào)試,需要的可以參考下
    2023-12-12
  • 虛函數(shù)與純虛函數(shù)(C++與Java虛函數(shù)的區(qū)別)的深入分析

    虛函數(shù)與純虛函數(shù)(C++與Java虛函數(shù)的區(qū)別)的深入分析

    本篇文章是對(duì)虛函數(shù)與純虛函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Qt+Live555搭建RTSP服務(wù)器的方法步驟

    Qt+Live555搭建RTSP服務(wù)器的方法步驟

    本文主要介紹了Qt+Live555搭建RTSP服務(wù)器的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 解析之C++的列表初始化語法

    解析之C++的列表初始化語法

    有朋友在使用std::array時(shí)發(fā)現(xiàn)一個(gè)奇怪的問題:當(dāng)元素類型是復(fù)合類型時(shí),編譯通不過。按說std::array和原生數(shù)組的行為幾乎是一樣的,可為什么當(dāng)元素類型不同時(shí),初始化語法還會(huì)有差別?這篇文章會(huì)介紹這個(gè)問題的原理,以及正確的解決方式。
    2021-05-05
  • C++使用BitBlt進(jìn)行窗口抓圖的方法

    C++使用BitBlt進(jìn)行窗口抓圖的方法

    這篇文章主要介紹了C++使用BitBlt進(jìn)行窗口抓圖的方法,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2021-01-01
  • C語言野指針及如何規(guī)避詳解

    C語言野指針及如何規(guī)避詳解

    這篇文章主要為大家介紹了C語言野指針及如何規(guī)避詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 深度探究C++中的函數(shù)重載的用法

    深度探究C++中的函數(shù)重載的用法

    這篇文章主要介紹了C++中的函數(shù)重載用法,包括重載時(shí)參數(shù)類型的差異以及匹配和轉(zhuǎn)換等方面問題的講解,需要的朋友可以參考下
    2016-01-01
  • C++之構(gòu)造函數(shù)默認(rèn)值設(shè)置方式

    C++之構(gòu)造函數(shù)默認(rèn)值設(shè)置方式

    這篇文章主要介紹了C++之構(gòu)造函數(shù)默認(rèn)值設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言練習(xí)題:求1到10的階乘之和簡單實(shí)例

    C語言練習(xí)題:求1到10的階乘之和簡單實(shí)例

    下面小編就為大家?guī)硪黄狢語言練習(xí)題:求1到10的階乘之和簡單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05

最新評(píng)論

马龙县| 莱西市| 屏南县| 五大连池市| 靖安县| 珲春市| 沧州市| 弥勒县| 海南省| 甘孜| 鹤壁市| 德保县| 阿拉善右旗| 永宁县| 交口县| 鄂伦春自治旗| 潍坊市| 汪清县| 无极县| 武乡县| 汝南县| 汉川市| 镇康县| 来宾市| 内丘县| 四川省| 乌审旗| 基隆市| 台北市| 双桥区| 阆中市| 沅江市| 武冈市| 福安市| 泾阳县| 盐源县| 蓝山县| 伊通| 环江| 茌平县| 华亭县|