欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++深入講解引用的特點(diǎn)及與指針的區(qū)別

 更新時(shí)間:2022年05月21日 10:24:56   作者:Mi?ronin  
引用是C++一個(gè)很重要的特性,顧名思義是某一個(gè)變量或?qū)ο蟮膭e名,對引用的操作與對其所綁定的變量或?qū)ο蟮牟僮魍耆葍r(jià),這篇文章主要給大家總結(jié)介紹了C++中引用的相關(guān)知識點(diǎn),需要的朋友可以參考下

一.引入

在生活中,我們可能也會(huì)給一些同學(xué)起外號,以“張磊”同學(xué)為例,我們可以叫他“張三石”,當(dāng)我們叫到這個(gè)外號的時(shí)候就會(huì)自然而然的想到“張磊”同學(xué),”張三石”就是張磊的別名,而引用也可以這樣簡單理解:在語法層面上,引用就是取別名。

二.C++中較為麻煩的運(yùn)算符

C++中的 * 和 & 有多重含義,在不同的使用條件下有不同的意思:

*

int *p = &a;   /1.指針
a = a * b;     /2.乘法
*p = 100;      /3.指向

&

int c = a&b;    /1.位運(yùn)算 轉(zhuǎn)換為二進(jìn)制
int *p = &a;    /2.取地址
int  a = 100;
int & ar = a;   /3.引用

三.引用的定義

引用不是新定義一個(gè)變量,而是給已存在變量取了一個(gè)別名,編譯器不會(huì)為引用變量開辟內(nèi)存空間,它與引用的變量共用同一塊內(nèi)存空間。

格式如下:

類型 & 引用變量名(對象名) = 引用實(shí)體

注意這里的空格是可選的,即

  • &符號與前后均可以有一個(gè)空格;如下:int & ra=a;
  • &符號與類型挨著,如下:int& ra=a;
  • &符號與引用名稱挨著,如下:int &ra=a;
int main()
{
int a =100; \\定義變量名
int b = a;\\將a的值賦給變量
int &c = a;\\引用 將c作為a的別名 c11中成為左值引用
return 0;
}

在這里就是相當(dāng)于一個(gè)實(shí)體取了兩個(gè)名字分別為a和c,并且在這個(gè)空間中不開辟新的空間。

四.引用的特點(diǎn)

  • 定義引用時(shí)必須給初始化
  • 沒有空引用
  • 沒有所謂的二級引用
  • 一個(gè)變量可以有多個(gè)引用(就相當(dāng)于一個(gè)變量有好幾個(gè)別名,這是可以的)

說明:

int main()
{
int a = 10;
int& b = a;
int& x;
int& y = NULL;
int&& c = a;
}

總而言之:

引用本身是一個(gè)變量,但是這個(gè)變量又僅僅是另外一個(gè)變量一個(gè)別名,它不占用內(nèi)存空間,它不是指針哦!僅僅是一個(gè)別名!

五.對比指針與引用

我們以交換函數(shù)為例

使用指針交換兩個(gè)整型值:

int my _swap (int*ap, int*bp)
{
	assert(ap != NULL && bp != NULL);
	int tmp = *ap;*ap = *bp;*bp = *ap;
}
int main()
{
	int x = 10, y = 20;
	my_swap{&x,&y);
	cout<< "x = " << x << " y = " << y << endl;
	return 0;
}

使用引用交換兩個(gè)指針:

void my_swap (int& a,int& b)
{
	int tmp = a;a = b;
	b = tmp;
}
int main ()
{
	int x = 10, y = 20;my_swap(x,y) ;
	cout << " x = " << x<< " y = " << y << endl;
	return 0;
}

形參為指針時(shí):第一句話一定要斷言,必須判斷空不空;并且在使用指針的時(shí)候 我們需要注意:是否為 野指針, 空指針 ,失效指針。

當(dāng)我們使用引用時(shí),不存在NULL引用,不需要判空,比指針更加安全

所以:能不使用指針就盡量不要使用指針! 

六.引用與指針的區(qū)別

1.語法層面的區(qū)別

從語法規(guī)則上講,指針變量存儲(chǔ)某個(gè)實(shí)例(變量或?qū)ο螅┑牡刂?

引用是某個(gè)實(shí)例的別名。

程序?yàn)橹羔樧兞糠峙鋬?nèi)存區(qū)域;而不為引用分配內(nèi)存區(qū)域。

int main()
{
	int a = 10;
	int* ip = &a;
	int& b = a;  \\b是a的別名 并沒有分配新的空間
}

解引用是指針使用時(shí)要在前加“*”;引用可以直接使用。

int main()
{
	int a = 10;
	int* ip = &a;
	int& b = a;  
	*ip = 100;//對于指針使用加“*”
	b = 200;  //引用不需要“*”
}

指針變量的值可以發(fā)生改變,存儲(chǔ)不同實(shí)例的地址;

引用在定義時(shí)就被初始化,之后無法改變(不能是其他實(shí)例的引用)。

int main()
{
	int a = 10,b = 20;
	int* ip = &a;
	ip = &b ;
	int& c = a;
	c = b;   //b的值給c實(shí)則是把b的值給a,將a的值改為20
}

指針變量的值可以為空(NULL,nullptr);沒有空引用。

指針變量作為形參時(shí)需要測試它的合法性(判空NULL);引用不需要判空。

對指針變量使用"sizeof"得到的是指針變量的大小; 對引用變量使用"sizeof"得到的是變量的大小。

int main()
{
	double dx = 10;
	double* dp = &dx;
	double& a = dx; 
	printf("sizeof(dp):%d\n", sizeof(dp));
	printf("sizeof(a):%d", sizeof(a));
}

運(yùn)行結(jié)果:

理論上指針的級數(shù)沒有限制;但引用只有一級。

即不存在引用的引用,但可以有指針的指針。

++引用與++指針的效果不一樣。

例如就++操作而言:

int main()
(
	int ar[5] = { 1,2,3,4,5 };
	int* ip = ar; //數(shù)組首元素地址
	int& b = ar[O]; //數(shù)組首元素的別名叫b
	++ip;  //由0下標(biāo)的地址指向1下標(biāo)的地址
	++b;  //由0下標(biāo)指向1下標(biāo)
}

對引用的操作直接反應(yīng)到所引用的實(shí)體(變量或?qū)ο螅?。對指針變量的操作,?huì)使指針變量指向下一個(gè)實(shí)體(變量或?qū)ο螅┑牡刂?而不是改變所指實(shí)體(變量或?qū)ο?的內(nèi)容。

int main()
(
	int ar[5] = { 1,2,3,4,5 };
	int* ip = ar; //數(shù)組首元素地址
	int& b = ar[O]; //數(shù)組首元素的別名叫b
	++(*ip); //值由1>>2 
	(*ip)++; //所有表達(dá)式結(jié)束后 進(jìn)行++ 
	//有括號 先取ip的值與*結(jié)合 然后++為所指之物的++
	int x = *ip++;
	//沒有括號 先將ip的值取出 與*結(jié)合 把所指之物取出(此時(shí)已與*結(jié)合完) 然后將ip取出進(jìn)行++ ++后的值回寫給ip 將值存儲(chǔ)到x中
	//通過()提高了優(yōu)先級
}

不可以對函數(shù)中的局部變量或?qū)ο笠砸没蛑羔樂绞椒祷亍?/p>

當(dāng)變量的生存期不受函數(shù)的影響時(shí)就可以返回地址

2.匯編層面的區(qū)別

匯編層面來講引用就是一個(gè)指針,但是引用并不是一個(gè)普通的指針是指針的語法槽,也可以看作是常性的指針 。

int main()
{
	int a = 10;
	int* ip = &a;
	int& x = a;
	*ip = 100;
	x = 200;
}

七.引用的其他使用

常引用

常引用實(shí)際上是一種萬能引用既可以引用普通變量 ,常量,也可以引用字面常量。

(1)引用普通變量

int main()
{
	int a = 10;
	int & b = a;
    const int& c = a;
    b += 10;
    a += 10;
    c += 10;
    return 0;
}

對于這塊報(bào)錯(cuò)問題:是因?yàn)閏是不可修改的

(2)引用常量

int main()
{
    int a = 10;
    const int b =20;
    int& x = a;
    int& y = b;  //error 不安全
    const int& y = b; //ok
    const int& z =10; //ok
    return 0;
}

(3)引用字面常量

引用字面常量時(shí),分兩步走,首先定義一個(gè)臨時(shí)量 去引用臨時(shí)量 不是引用真實(shí)的字面常量10。

int main()
{
    int a = 10;
    const int& z =10; //ok
    //int tmp =10;
    //const int &z = tmp;
    return 0;
}

數(shù)組引用

在引用數(shù)組時(shí),必須知道數(shù)組的大小

int main()
{
    int a = 10;
    int b = 10;
    int ar[5] = { 1,2,3,4,5 };
    int& x = ar[0];  //ok
    int(&x)[5] = ar; //ok   沒有[5]無法編譯通過
    return 0;
}

指針引用

引用既然就是一個(gè)變量,那我同樣也可以給指針變量取一個(gè)別名

int main()
{
	int a = 100;
	int *p = &a;
	int * &rp = p;
	cout << a << endl;
	cout << *p << endl;
	cout << *rp << endl; //這里為什么要將*放在前面,因?yàn)閜的類型是 int * 作為一個(gè)整體哦??!
	cout << p << endl;
	cout << rp << endl;
	getchar();
	return 0;
}
/*
100
100
100
012FF84C
012FF84C
*/

我們發(fā)現(xiàn)這里的指針變量p和它的引用(別名)rp是完全一樣的。但是由于引用的目的跟指針的目的是類似的,所以一般不需要對指針再起別名了。

到此這篇關(guān)于C++深入講解引用的特點(diǎn)及與指針的區(qū)別的文章就介紹到這了,更多相關(guān)C++引用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C指針原理教程之C內(nèi)嵌匯編

    C指針原理教程之C內(nèi)嵌匯編

    在學(xué)習(xí) C 語言內(nèi)嵌匯編的實(shí)驗(yàn)過程中,發(fā)現(xiàn)內(nèi)嵌匯編極容易造成段錯(cuò)誤。
    2019-02-02
  • C語言內(nèi)存泄漏常見情況及解決方案詳解

    C語言內(nèi)存泄漏常見情況及解決方案詳解

    這篇文章主要為大家介紹了C語言內(nèi)存泄漏常見情況及解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 深入解析C++編程中的純虛函數(shù)和抽象類

    深入解析C++編程中的純虛函數(shù)和抽象類

    這篇文章主要介紹了深入解析C++編程中的純虛函數(shù)和抽象類,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C語言實(shí)現(xiàn)車輛信息管理系統(tǒng)

    C語言實(shí)現(xiàn)車輛信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)車輛信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++中指針的引用*&的具體使用

    C++中指針的引用*&的具體使用

    本文主要介紹了C++中指針的引用*&的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++如何判斷一個(gè)數(shù)字是否為質(zhì)數(shù)

    C++如何判斷一個(gè)數(shù)字是否為質(zhì)數(shù)

    這篇文章主要為大家詳細(xì)介紹了C++如何判斷一個(gè)數(shù)字是否為質(zhì)數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 深入理解C預(yù)處理器

    深入理解C預(yù)處理器

    下面小編就為大家?guī)硪黄钊肜斫釩預(yù)處理器。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-08-08
  • FFmpeg實(shí)現(xiàn)將編碼后數(shù)據(jù)保存成mp4

    FFmpeg實(shí)現(xiàn)將編碼后數(shù)據(jù)保存成mp4

    這篇文章主要為大家詳細(xì)介紹了FFmpeg如何實(shí)現(xiàn)將編碼后數(shù)據(jù)保存成mp4,即從內(nèi)存塊中獲取原始數(shù)據(jù),然后依次進(jìn)行解碼、編碼、最后保存成mp4視頻文件,感興趣的可以了解一下
    2023-08-08
  • C++中實(shí)現(xiàn)OpenCV圖像分割與分水嶺算法

    C++中實(shí)現(xiàn)OpenCV圖像分割與分水嶺算法

    分水嶺算法是一種常用的圖像區(qū)域分割法,本文主要介紹了OpenCV圖像分割與分水嶺算法,使用C++實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-06-06
  • C語言內(nèi)存操作函數(shù)詳解

    C語言內(nèi)存操作函數(shù)詳解

    這篇文章主要介紹了C語言全部內(nèi)存操作函數(shù)的實(shí)現(xiàn)詳細(xì)講解,作者用圖文代碼實(shí)例講解的很清晰,有感興趣的同學(xué)可以研究下
    2021-10-10

最新評論