首页 > 编程语言 >【C++】C++基础知识

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

时间:2024-09-26 10:25:25浏览次数:1  
标签:const struct int C++ 基础知识 student Student 指针

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;
}

标签:const,struct,int,C++,基础知识,student,Student,指针
From: https://www.cnblogs.com/AirCL/p/18432941

相关文章

  • 广州C++信奥老师解一本通题 1260:1282:最大子矩阵
    ​ 【题目描述】已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1×1)子矩阵。比如,如下4×4的矩阵0 -2-7 09 2-6 2-4 1-4 1-1 8 0-2 的最大子矩阵是92-41-18 这个子矩阵的大小是15......
  • docker简介、安装、基础知识
    基础知识Docker简介:1.Docker是一种用于构建、发布及运行应用程序的开源项目,他通过容器化技术简化了应用程序的部署和管理2.Docker是一个开源的应用容器引擎,基于go语言开发,为应用打包、部署平台,而非单纯的虚拟化技术3.Docker类似于集装箱,各式各样的货物,经过集装箱的标准化进......
  • 如何解决 :libstdc++.so.6: version `GLIBCXX_3.4.30‘ not found
    如何解决:libstdc++.so.6:version`GLIBCXX_3.4.30‘notfound问题描述:当您尝试在Linux系统上运行某个程序或软件时,有时会遇到一个错误,提示libstdc++.so.6:versionGLIBCXX_3.4.30notfound。这个错误表明您的系统缺少某个特定版本的C++标准库,具体来说就是GLIBCXX_3.4.30......
  • C++ 的异常安全理念
    C++中的异常安全是一个至关重要的概念,它关乎到程序的健壮性、资源管理和数据状态的一致性。以下是对C++异常安全的详细解析:一、异常安全的概念异常安全是指在程序面对函数或方法可能抛出异常的情况下,仍能保证资源的正确释放和数据状态的一致性。这要求程序在异常发生时,能够妥......
  • C++ day06
    手动实现栈:#include<iostream>#include<cstring>usingnamespacestd;classStatic{private:int*arr;//动态分配栈inttop;//指向栈顶元素intcapacity;//记录栈的最大容量public://有参构造函数Static(i......
  • C++ 修饰符类型
    C++中的类型限定符const实例volatile实例mutable实例static实例register实例C++允许在 char、int和double 数据类型前放置修饰符。修饰符是用于改变变量类型的行为的关键字,它更能满足各种情境的需求。下面列出了数据类型修饰符:signed:表示变量可以存储......
  • C++ 常量
    整数常量浮点常量布尔常量字符常量字符串常量定义常量#define预处理器const关键字常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。常量就像是常规的变量,只不过......
  • C++ VECTOR容器
    SLT中的VECTORvector与string一样是STL标准库中的容器,可以将其理解为C语言中的数组,不过数组里面存放的是内置类型,而为了让其能支持更多的数据类型(自定义类型),C++在STL中规定了vector模板标准,使得我们的自定义类型数据也能存放在数组当中。template<classT,classAlloc=......
  • 【算法】C++KMP算法的简洁实现
    目录简介next数组匹配完整代码简介对于朴素的字符串匹配算法,如果想在主串中寻找到第一次出现子串的位置,需要依次枚举主串中的每一个位置作为起始位置进行匹配尝试,如果主串中存在许多与子串相似结构的部分,那么朴素算法会进行大量的无用枚举,时间复杂度非常之高。KMP算法......
  • 面试真题 | 小红书-C++引擎架构
    文章目录1.自我介绍2.项目3.c++多态,如何实现的,虚表、虚表指针存储位置C++多态的实现机制虚表指针的存储位置面试官的深度追问4.explicit关键字explicit关键字的回答面试官可能的追问5.unique_ptr、shared_ptr、weak_ptr的原理,有没有线程安全问题,weak_ptr的解决......