【C++】C++基础知识

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;
}
posted @ 2024-09-26 10:27  AirCL  阅读(15)  评论(0编辑  收藏  举报