天天看點

C++ ~ 引用1、引用概念2、引用作函數參數3、引用的意義4、引用的本質5、指針引用示例代碼

文章目錄

  • 1、引用概念
    • 1.1、引用示例代碼
  • 2、引用作函數參數
    • 2.1、基礎類型的引用
    • 2.2、複雜資料類型引用
  • 3、引用的意義
  • 4、引用的本質
  • 5、指針引用示例代碼

1、引用概念

變量名回顧

  變量名實質上是一段連續存儲空間的别名,是一個标号(門牌号)

  程式中通過變量來申請并命名記憶體空間

  通過變量的名字可以使用存儲空間

引用是C++中新增加的概念,引用可以看作一個已定義變量的别名。

引用的文法:Type& name = var;

1.1、引用示例代碼

#include <iostream>
using namespace std;

int main()
{
    int a = 10;
    // 引用的文法:Type& name = var;
    int &b = a;

    b = 100; //相當于把a修改成100了

    cout << b << endl;
    cout << a << endl;

    cout << "hello..." << endl;
    system("pause");

    return 0;

}
           

輸出結果:

C++ ~ 引用1、引用概念2、引用作函數參數3、引用的意義4、引用的本質5、指針引用示例代碼

注意:引用是C++的文法,屬于C++編譯器對C的擴充,不要用C語言的文法去思考它。

2、引用作函數參數

普通引用在聲明時必須用其它的變量進行初始化,引用作為函數參數聲明時不進行初始化。

2.1、基礎類型的引用

示例代碼:

#include <iostream>
using namespace std;

void myswap(int a, int b)
{
    int c = 0;
    c = a;
    a = b;
    b = c;
}

void myswap02(int *a, int *b)
{
    int c = 0;
    c = *a;
    *a = *b;
    *b = c;
}

// 引用作為函數參數聲明時不進行初始化
void myswap03(int &a, int &b)
{
    int c = 0;
    c = a;
    a = b;
    b = c;
}

int main()
{
    int x, y;
    x = 10;
    y = 20;

    myswap(x, y);  //無法起到交換效果
    printf("x:%d , y:%d \n", x, y);

    myswap02(&x, &y);  // 使用指針
    printf("x:%d , y:%d \n", x, y);

    //a就是x的别名  b就是y的别名
    myswap03(x, y);  // 引用
    printf("x:%d , y:%d \n", x, y);

    cout << "hello..." << endl;
    system("pause");

    return 0;

}
           

輸出結果:

C++ ~ 引用1、引用概念2、引用作函數參數3、引用的意義4、引用的本質5、指針引用示例代碼

2.2、複雜資料類型引用

示例代碼:

#include <iostream>
using namespace std;

struct Teacher
{
    char name[64];
    int age;
};

void printfT(Teacher *pT)
{
    cout << pT->age << endl;
}

//pT是t1的别名 ,相當于修改了t1
void printfT2(Teacher &pT)
{
    //cout<<pT.age<<endl;
    pT.age = 33;
}

//pT和t1的是兩個不同的變量
void printfT3(Teacher pT)
{
    cout << pT.age << endl;
    pT.age = 45; //隻會修改pT變量 ,不會修改t1變量
}
int main()
{
    Teacher t1;
    t1.age = 35;

    printfT(&t1);

    printfT2(t1);                   //pT是t1的别名
    printf("t1.age:%d \n", t1.age); //33

    printfT3(t1);                   // pT是形參 ,t1 copy一份資料  給pT     //---> pT = t1
    printf("t1.age:%d \n", t1.age); //35

    cout << "hello..." << endl;
    system("pause");

    return 0;

}
           

輸出結果:

C++ ~ 引用1、引用概念2、引用作函數參數3、引用的意義4、引用的本質5、指針引用示例代碼

3、引用的意義

1)引用作為其它變量的别名而存在,是以在一些場合可以代替指針。

2)引用相對于指針來說具有更好的可讀性和實用性。

4、引用的本質

1)引用在C++中的内部實作是一個常指針。

2)C++編譯器在編譯過程中使用常指針作為引用的内部實作,是以引用所占用的空間大小與指針相同。

3)從使用的角度,引用會讓人誤會其隻是一個别名,沒有自己的存儲空間。這是C++為了實用性而做出的細節隐藏。

5、指針引用示例代碼

#include <iostream>
using namespace std;

//
struct Teacher
{
    char name[64];
    int age;
};

//在被調用函數 擷取資源
int getTeacher(Teacher **p)
{
    Teacher *tmp = NULL;
    if (p == NULL)
    {
        return -1;
    }
    tmp = (Teacher *)malloc(sizeof(Teacher));
    if (tmp == NULL)
    {
        return -2;
    }
    tmp->age = 33;
    // p是實參的位址  *實參的位址 去間接的修改實參的值
    *p = tmp;
}

//指針的引用 做函數參數
int getTeacher2(Teacher *&myp)
{
    //給myp指派 相當于給main函數中的pT1指派
    myp = (Teacher *)malloc(sizeof(Teacher));
    if (myp == NULL)
    {
        return -1;
    }
    myp->age = 36;
}

void FreeTeacher(Teacher *pT1)
{
    if (pT1 == NULL)
    {
        return;
    }
    free(pT1);
}

int main()
{
    Teacher *pT1 = NULL;

    //1 c語言中的二級指針
    getTeacher(&pT1);
    cout << "age:" << pT1->age << endl;
    FreeTeacher(pT1);

    //2 c++中的引用 (指針的引用)
    //引用的本質 間接指派後2個條件 讓c++編譯器幫我們程式員做了。
    getTeacher2(pT1);

    cout << "age:" << pT1->age << endl;
    FreeTeacher(pT1);

    cout << "hello..." << endl;
    system("pause");

    return 0;
    
}
           

輸出結果:

C++ ~ 引用1、引用概念2、引用作函數參數3、引用的意義4、引用的本質5、指針引用示例代碼

繼續閱讀