溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言中const,指針和引用的關系是什么

發(fā)布時間:2022-01-12 20:19:38 來源:億速云 閱讀:141 作者:iii 欄目:開發(fā)技術

這篇“C語言中const,指針和引用的關系是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C語言中const,指針和引用的關系是什么”文章吧。

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;是等價的

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

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

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

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

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

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

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 不可改

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

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

1.s0等價于p,而我們對*s0可以進行修改,繼而是錯誤的;

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

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

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

我們再來看這樣一段代碼,這次我們將對p進行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不可改

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

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

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

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

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

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

如果我們通過強制轉換使得通過常量地址改變該值

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;
}

對于c++,我們產生的結果為a=10,b=10,*p=100,對于b=a,依舊給b賦值的是10

C語言中const,指針和引用的關系是什么

造成這樣的原因實際上是因為C++編譯會將常量a進行數(shù)值替換,繼而b=a變成了b=10,C++對于常變量當作常量

C語言中const,指針和引用的關系是什么

當使用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 與引用的關系

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

C語言中const,指針和引用的關系是什么

int &*pref = p;是錯誤的,該代碼是一個指針指向的是一個引用,是不允許編譯通過的,因為在語法規(guī)則上引用不具有地址,即使引用可以進行取地址,但是是不容許這樣做的,也就是我們可以定義一個引用去引用指針,而不能定義一個指針去指向引用

const 與指針、引用

我們在寫一段代碼詳細探討

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

C語言中const,指針和引用的關系是什么

以上就是關于“C語言中const,指針和引用的關系是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI