【C++】C++基礎知識

AirCL發表於2024-09-26

C++基礎

1. 指標

1.1 定義與使用

  1. 指標在記憶體中佔多少位元組?

指標在32位作業系統中佔4個位元組,在64位作業系統中佔8個位元組。

  1. 定義指標的兩種方式如下
/**
 * 定義指標的兩種形式
 */

// 1.
int a = 10;
int *p;
p = &a;

// 2.
int *p2 = &a;

1.2 空指標與野指標

  1. 空指標

空指標:指標變數指向記憶體中編號為0的空間。0~255的記憶體編號是系統佔用的,因此不可以訪問。

用途:初始化指標變數。

注意:空指標指向的記憶體空間是不可以訪問的。

/**
 * 空指標
 */

int *p_NULL = NULL;
*p_NULL = 100;
cout << *p_NULL;
  1. 野指標

野指標:指標變數指向非法的記憶體空間。

/**
 * 野指標
 */
int *p_wild = (int *)0X1100;
cout << *p_wild << endl;

1.3 const 修飾指標

  1. const修飾指標——常量指標

指標指向可以改,但指標指向變數值不可改

/**
 * const修飾指標——常量指標
 */
int a,b;
const int * p=&a //常量指標
        
//那麼分為一下兩種操作
*p=9;//操作錯誤
p=&b;//操作成功
  1. const修飾常量——指標常量

指標指向不可以改,但指向指向變數值可以改

/**
 * const修飾常量——指標常量
 */
int a,b;
int * const p=&a //指標常量
        
//那麼分為一下兩種操作
*p=9;//操作成功
p=&b;//操作錯誤
  1. const既修飾指標又修飾常量
    指標指向不可以改,指向指向變數值也不可以改
/**
 * const既修飾指標又修飾常量
 */
const int * const p_3 = &a;

口訣:左數右指

1.4 指標與陣列

利用指標訪問陣列

/**
 * 指標訪問陣列
 */
int arr_0[] = {0, 1, 2, 3, 4, 5};
int * p_arr = arr_0;
cout << *(p_arr + 1) << endl;
p_arr++;
cout << *p_arr;

1.5 指標與函式

利用指標作為函式引數,可以修改實參的值

2. 結構體

2.1 定義

結構體屬於使用者自定義的資料型別,允許使用者儲存不同的資料型別。

2.2 結構體定義和使用

語法:

struct 結構體名稱 {結構體成員列表};

透過結構體建立變數的方式有三種:

  • struct 結構體名稱 變數名
  • struct 結構體名稱 變數名 =
  • 定義結構體時順便建立變數(不建議使用,自己寫的時候可以使用,不利於多人共同開發)

Examples:

#include "iostream"
using namespace std;

struct Student{
    string id;
    string name;
    int age;
    float score;
}student_3;

int main(){
    // 1. struct 結構體名稱 變數名
    struct Student student_1;
    // Student student_1;也可以
    student_1.id = "110";
    student_1.name = "Jon";
    student_1.age = 19;
    student_1.score = 100;
    // 2. struct 結構體名稱 變數名 = {成員1值,成員2值}
    struct Student student_2 = {"12138", "July", 18, 98};
    // Student student_2 = {"12138", "July", 18, 98}; 也可以
    // 3. 定義結構體時順便建立變數,上邊的student_3即是這種建立方式
    student_3.id = "120";
    student_3.name = "Mick";
    student_3.age = 20;
    student_3.score = 101;

    cout << student_1.id << endl << student_1.name << endl << student_1.age << endl << student_1.score << endl;
    cout << student_2.id << endl << student_2.name << endl << student_2.age << endl << student_2.score << endl;
    cout << student_3.id << endl << student_3.name << endl << student_3.age << endl << student_3.score << endl;

    return 0;
}

2.3 結構體陣列

作用:將自定義的結構體放入到陣列中方便維護

語法:

struct 結構體名 陣列名[元素個數] = {{}, {}, ..., {}};

Examples:

    /**
     * 結構體陣列
     */

    struct Student stuArray[3] = {
            {"001", "stu1", 18, 99},
            {"002", "stu2", 19, 99.9},
            {"003", "stu3", 20, 99},
    };
    // 給結構體陣列元素賦值
    stuArray[1].score = 100;
    //遍歷結構體陣列
    for(int i = 0; i < 3; i++){
        cout << "id:" << stuArray[i].id
             << " name:" << stuArray[i].name 
             << " age:" << stuArray[i].age 
             << " score:" << stuArray[i].score 
             << endl;
    }

2.4 結構體指標

作用:透過指標訪問結構體中的成員。利用運算子->可以透過結構體指標訪問結構體屬性。

Examples:

    /**
     * 結構體指標
     */

    struct Student student_pointer = {"010", "stu10", 8, 9};
    struct Student * p = & student_pointer;
    cout << "id:" << p->id << endl;

2.5 結構體巢狀結構體

作用:結構體中的成員可以是另一個結構體。

例如:每個老師輔導一名學生,一個老師的結構體中,記錄一個學生的結構體。

Examples:

struct Student{
    string id;
    string name;
    int age = 0;
    float score = 0;
}student_3;

struct Teacher{
    string id;
    string name;
    struct Student stu;
};

2.6 結構體做函式引數

作用:將結構體作為函式引數向函式中傳遞。

傳遞方式有兩種:

  • 值傳遞
  • 地址傳遞

Examples:

//值傳遞
void swapStudentScoreFun1(struct Student stu1, struct Student stu2){

    float temp;

    temp = stu1.score;
    stu1.score = stu2.score;
    stu2.score = temp;

    return;
}
//地址傳遞
void swapStudentScoreFun2(struct Student * stu1, struct Student * stu2){

    float temp;

    temp = stu1->score;
    stu1->score = stu2->score;
    stu2->score = temp;

    return;
}
int main(){
    /**
    * 結構體做函式引數
    */
    
    struct Student stu1, stu2;
    stu1 = {"1", "stu1", 18, 99};
    stu2 = {"2", "stu2", 18, 88};
    
    swapStudentScoreFun1(stu1, stu2);
    cout << "id:" << stu1.id << " name:" << stu1.name << " age:" << stu1.age << " score:" << stu1.score << endl;
    cout << "id:" << stu2.id << " name:" << stu2.name << " age:" << stu2.age << " score:" << stu2.score << endl;
    
    swapStudentScoreFun2(&stu1, &stu2);
    cout << "id:" << stu1.id << " name:" << stu1.name << " age:" << stu1.age << " score:" << stu1.score << endl;
    cout << "id:" << stu2.id << " name:" << stu2.name << " age:" << stu2.age << " score:" << stu2.score << endl;
}

2.7 結構體中const的使用場景

作用:用const來防止誤操作。

void printStructStudent(const struct Student * stu){
    
    //在傳參處寫上const後,無法對傳入的stu進行修改,只能讀取
    // stu->score = 100;

    cout << stu->id << endl << stu->name << endl << stu->age << endl << stu->score << endl;
    
    return;
}

相關文章