C++超詳細(xì)講解引用和指針
引用概念
引用的本質(zhì):給已有的變量名 取個(gè)別名
//給num取個(gè)別名為b int num =100; //&不是取b的地址 只是描述b是num的別名 編譯器不會(huì)為b開辟新的空間 int &b = num;//num的別名 是b //操作b等價(jià)操作num


定義步驟
1、&修飾別名
2、給哪個(gè)變量取別名 就定義哪個(gè)變量
3、從上往下 整體替換
案例1:給數(shù)組取別名
int arr[5] ={1,2,3,4,5};
int (&new_arr)[5] = arr;法一:
void test02()
{
int arr[5] = {10,20,30,40,50};
//需求:給arr起個(gè)別名
int (&my_arr)[5] = arr;//my_arr就是數(shù)組arr的別名
int i=0;
for(i=0;i<5;i++)
{
cout<<my_arr[i]<<" ";
}
cout<<endl;
}法二:配合typedef
void test03()
{
int arr[5] = {10,20,30,40,50};
//1、用typedef 給數(shù)組類型 取個(gè)別名
//TYPE_ARR就是一個(gè)數(shù)組類型(有5個(gè)元素 每個(gè)元素位int)
typedef int TYPE_ARR[5];
//myArr就是數(shù)組arr的別名
TYPE_ARR &myArr=arr;
int i=0;
for(i=0;i<5;i++)
{
cout<<myArr[i]<<" ";
}
cout<<endl;
}引用必須初始化
int &b;//非法的
int num = 10; int &a = num; int data = 20; a = data;//不是data別名為a 而是將data值賦值a(num)
引用初始化后不能更改
引用一旦確定是誰的別名 就不能更改
int num = 10; int &b = num; int data = 20; b=data;//千萬不要認(rèn)為是b給data取別名 僅僅是將data的值賦值b也就是data賦值num
引用作為函數(shù)的參數(shù)可以替代指針變量
void swap_int01(int a1, int b1)
{
int tmp = a1;
a1 = b1;
b1 = tmp;
}
void swap_int02(int *a1, int *b1)//a1=&a, b1=&b
{
//*a1 == a, *b1 == b
int tmp = *a1;
*a1 = *b1;
*b1 = tmp;
}
void swap_int03(int &a1, int &b1)//int &a1 = a, int &b1=b
{
//a1 == a, b1 == b
int tmp = a1;
a1 = b1;
b1 = tmp;
}
void test07()
{
int a = 10;
int b = 20;
cout<<"a = "<<a<<", b = "<<b<<endl;
// swap_int01(a, b);//交換 不成功
// swap_int02(&a, &b);//交換 成功
swap_int03(a, b);//交換 成功
cout<<"a = "<<a<<", b = "<<b<<endl;
}
int main(int argc, char *argv[])
{
test07();
return 0;
}引用作為函數(shù)的參數(shù)的好處:
1、函數(shù)內(nèi)部 直接通過引用操作外部變量的值
2、省去了指針的操作
3、函數(shù)的形參不會(huì)擁有新的空間(節(jié)約了空間)
常引用
int &a = 10;//err
void test08()
{
//a就叫常引用 不能通過a修改空間的值
const int &a = 10;//ok
cout<<"a = "<<a<<endl;//10
}常引用 一般作為函數(shù)的參數(shù) 防止函數(shù)內(nèi)部修改外部空間值
//常引用 作為函數(shù)的參數(shù) 即節(jié)約了空間 又防止函數(shù)內(nèi)部修改外部變量的值
void printf_num(const int &a)
{
//a = 1000;//err
cout<<" num = "<<a<<endl;
}
void test09()
{
int num = 10;
printf_num(num);
}常量的引用:
void test09()
{
//給常量10取個(gè)別名 叫num
//int &針對(duì)的是int ,10是const int類型
//const int 針對(duì)的是const int, 10是const int類型
const int &num = 10;
cout<<"num = "<<num<<endl;//10
}引用作為函數(shù)的返回值類型
當(dāng)函數(shù)返回值作為左值 那么函數(shù)的返回值類型必須是引用。
(1)、通過函數(shù)返回值 在外界操作 函數(shù)內(nèi)部申請(qǐng)的空間
int& get_data(void)
{
static int data = 100;
//不要返回 普通局部變量的 引用
return data;//返回誰 外界的a就給data取別名
}
void test10()
{
int &a = get_data();
cout<<"data = "<<a<<endl;
}(2)、引用作為函數(shù)的返回值類型 可以完成鏈?zhǔn)讲僮?/p>

引用的本質(zhì)
引用的本質(zhì)在c++內(nèi)部實(shí)現(xiàn)是一個(gè)指針常量. Type& ref = val; // Type* const ref = &val;
c++編譯器在編譯過程中使用常指針作為引用的內(nèi)部實(shí)現(xiàn),因此引用所占用的空間大小與指針相同,只是這個(gè)過程是編譯器內(nèi)部實(shí)現(xiàn),用戶不可見
引用的本質(zhì):常量指針變量
int num = 10; int &b = num;//b == num //底層實(shí)現(xiàn) //b是只讀 *b可讀可寫 int * const b = # //b = 100; *b = 100;
指針的引用(了解)

new_p就是指針的引用
指針的引用的場景:
void get_memory01(int **p1)//int **p1 = &p
{
//*p1 == p
*p1 = (int *)calloc(1, sizeof(int));
**p1 = 100;
}
void get_memory02(int* &p1)//int* &p1 = p
{
//p1 == p
p1 = (int *)calloc(1, sizeof(int));
*p1 = 100;//*p1 = *p
}
void test13()
{
int *p = NULL;
//get_memory01(&p);
get_memory02(p);
cout<<"*p = "<<*p<<endl;
}
指針和引用的區(qū)別
1、引用必須被初始化(初始值必須是一個(gè)對(duì)象),指針不必(但最好要初始化)。
2、引用初始化以后不能被改變,指針可以改變所指的對(duì)象。
3、不存在指向空值的引用,但是存在指向空值的指針。
4、指針通過某個(gè)指針變量指向一個(gè)對(duì)象后,對(duì)它所指向的變量間接操作。引用本身就是目標(biāo)變量的別名,對(duì)引用的操作就是對(duì)目標(biāo)變量的操作。
5、指針是一個(gè)對(duì)象,可以定義指向指針的指針。但引用不是對(duì)象,沒有實(shí)際地址,所以不能定義指向引用的指針,也不能定義指向引用的引用。
到此這篇關(guān)于C++超詳細(xì)講解引用和指針的文章就介紹到這了,更多相關(guān)C++引用和指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++基于EasyX框架實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲
EasyX是針對(duì)C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。本文將利用EasyX框架實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲,需要的可以參考一下2023-01-01
C++實(shí)現(xiàn)尋找最低公共父節(jié)點(diǎn)的方法
這篇文章主要介紹了C++實(shí)現(xiàn)尋找最低公共父節(jié)點(diǎn)的方法,是數(shù)據(jù)結(jié)構(gòu)中二叉樹的一個(gè)經(jīng)典算法,有一定的借鑒價(jià)值,需要的朋友可以參考下2014-09-09
解析C++編程中virtual聲明的虛函數(shù)以及單個(gè)繼承
這篇文章主要介紹了C++編程中virtual聲明的虛函數(shù)以及單個(gè)繼承,剖析虛函數(shù)和單個(gè)基類所能夠繼承的成員,要的朋友可以參考下2016-01-01
C語言實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02

