学习c++的第九天

目录

结构体

定义与访问结构

结构作为函数参数

指向结构的指针

[typedef 关键字](#typedef 关键字)

[示例 1:为结构体创建类型别名](#示例 1:为结构体创建类型别名)

[示例 2:为函数指针创建类型别名](#示例 2:为函数指针创建类型别名)


结构体

定义与访问结构

在C++中,结构体(structure)是一种用户自定义的数据类型,用于组合不同类型的数据成员。结构体可以包含变量、函数和其他数据类型。

要定义一个结构体,在C++中使用struct关键字,然后指定结构体的名称和成员变量。结构体的定义位于大括号{}内部,每个成员变量都由其类型和名称组成,并用分号;分隔。

struct 语句的格式如下:

cpp 复制代码
struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;
  • type_name是为结构体定义的名称,它可以自定义,但建议遵循C++命名约定,例如使用驼峰式命名法。类似于变量名或函数名,结构体名称也需要唯一。
  • 在结构体定义的末尾,可以选择性地指定一个或多个结构体变量。这些变量将使用结构体类型中定义的成员变量分配内存空间。结构体变量的定义方式与其他变量的定义方式相同。
  • 结构体成员变量可以是任何有效的数据类型,包括基本类型(如int、float等)、自定义类型(如字符串、数组等)和其他结构体类型。结构体成员变量之间用逗号分隔。
  • 结构体成员变量的访问方式是使用点运算符 ".",例如:object.member_name。其中,object是结构体变量的名称,member_name是结构体成员变量的名称。
  • 结构体变量的初始化方式与其他变量的初始化方式相同,可以使用赋值运算符或花括号语法。

下面是一个示例,演示如何定义一个名为Person的结构体,并创建两个Person结构体变量:

cpp 复制代码
#include <iostream>
#include <string>

// 定义结构体
struct Person {
    std::string name;
    int age;
    double height;
} person1, person2; // 创建两个Person结构体变量

int main() {
    // 初始化person1结构体变量
    person1.name = "Alice";
    person1.age = 25;
    person1.height = 1.65;

    // 初始化person2结构体变量
    person2.name = "Bob";
    person2.age = 30;
    person2.height = 1.8;

    // 访问结构体成员
    std::cout << "Name: " << person1.name << std::endl;
    std::cout << "Age: " << person1.age << std::endl;
    std::cout << "Height: " << person1.height << " meters" << std::endl;

    std::cout << "Name: " << person2.name << std::endl;
    std::cout << "Age: " << person2.age << std::endl;
    std::cout << "Height: " << person2.height << " meters" << std::endl;

    return 0;
}

在上述代码中,我们使用struct关键字定义了一个名为Person的结构体,并在大括号内部定义了三个成员变量:name、age和height。然后,在结构体定义的末尾,我们定义了两个Person结构体变量:person1和person2。

在main函数中,我们初始化了这两个结构体变量,并使用点运算符.访问它们的成员变量。最后,我们使用std::cout语句打印结构体中的成员变量值。

结构作为函数参数

在C++中,可以将结构作为函数的参数传递。这意味着我们可以将结构体变量作为参数传递给函数,以便在函数中访问和操作结构体成员变量。

结构体可以作为函数参数传递,有两种传递方式:

  • 传值方式:将整个结构体作为参数传递给函数,这将复制整个结构体,并将副本传递给函数。在函数中对结构体成员变量的更改不会影响原始结构体。
  • 引用方式:将结构体作为引用参数传递给函数,这将允许函数直接访问原始结构体。在函数中对结构体成员变量的更改将直接反映在原始结构体上。

下面是一个示例程序,演示如何将结构体作为函数参数传递:

cpp 复制代码
#include <iostream>
#include <string>

// 定义结构体
struct Person {
    std::string name;
    int age;
    double height;
};

// 函数声明
void printPerson(Person p); // 传值方式
void updatePerson(Person& p, std::string newName, int newAge, double newHeight); // 引用方式

int main() {
    // 创建一个Person结构体变量
    Person person;
    person.name = "Alice";
    person.age = 25;
    person.height = 1.65;

    // 传值方式调用函数
    printPerson(person);

    // 引用方式调用函数
    updatePerson(person, "Bob", 30, 1.8);
    printPerson(person);

    return 0;
}

// 函数定义 - 传值方式
void printPerson(Person p) {
    std::cout << "Name: " << p.name << std::endl;
    std::cout << "Age: " << p.age << std::endl;
    std::cout << "Height: " << p.height << " meters" << std::endl;
}

// 函数定义 - 引用方式
void updatePerson(Person& p, std::string newName, int newAge, double newHeight) {
    p.name = newName;
    p.age = newAge;
    p.height = newHeight;
}

在上面的示例程序中,我们定义了一个名为Person的结构体,并创建了一个名为person的结构体变量。然后,我们调用了两个函数printPerson和updatePerson,并将person作为参数传递给这些函数。

printPerson函数采用传值方式将结构体作为参数传递,而updatePerson函数采用引用方式将结构体作为参数传递。

在printPerson函数中,我们使用点运算符"."访问结构体成员变量,并打印它们的值。

在updatePerson函数中,我们使用引用参数修改了结构体成员变量的值。由于p是指向person结构体的引用,因此对p的更改将直接反映在person结构体上。

最后,我们再次调用printPerson函数,并打印已更新的结构体成员变量的值。

指向结构的指针

在C++中,可以使用指针来引用和操作结构体。指向结构的指针指向结构体变量的内存地址,允许我们通过解引用操作符(*)来访问和修改结构体成员变量。

以下是一个示例演示如何声明和使用指向结构的指针:

cpp 复制代码
#include <iostream>
#include <string>

// 定义结构体
struct Person {
    std::string name;
    int age;
    double height;
};

int main() {
    // 创建一个Person结构体变量
    Person person;
    person.name = "Alice";
    person.age = 25;
    person.height = 1.65;

    // 创建指向Person结构体的指针,并将其指向person变量
    Person* ptr = &person;

    // 通过指针访问结构体成员变量
    std::cout << "Name: " << ptr->name << std::endl;
    std::cout << "Age: " << ptr->age << std::endl;
    std::cout << "Height: " << ptr->height << " meters" << std::endl;

    // 修改结构体成员变量
    ptr->name = "Bob";
    ptr->age = 30;
    ptr->height = 1.8;

    // 通过原始结构体变量访问已修改的成员变量
    std::cout << "Name: " << person.name << std::endl;
    std::cout << "Age: " << person.age << std::endl;
    std::cout << "Height: " << person.height << " meters" << std::endl;

    return 0;
}

在上述示例中,我们定义了一个名为Person的结构体,并创建了一个名为person的结构体变量。

然后,我们声明了一个指向Person结构体的指针ptr,并使用取地址运算符(&)将其指向person变量的内存地址。

通过指针访问结构体成员变量时,我们使用箭头运算符(->),它结合了解引用操作符(*)和点运算符(.)。例如,ptr->name等效于(*ptr).name,允许我们访问ptr所指向的结构体的成员变量。

我们还可以通过指针对结构体成员变量进行修改。例如,ptr->name = "Bob"将修改person的name成员变量的值。

最后,我们通过原始结构体变量访问已修改的成员变量,并打印它们的值。

请注意,当使用指向结构的指针时,需要确保指针指向有效的结构体对象。否则,解引用指针可能会导致未定义的行为或错误。

typedef 关键字

typedef是C和C++中的关键字,用于为已存在的类型创建一个新的类型别名。通过typedef,您可以为已有类型指定一个新的名称,从而增强代码的可读性和可维护性。

typedef的语法如下:

cpp 复制代码
typedef existing_type new_type;

其中,existing_type是已存在的类型,而new_type是您为该类型定义的新的类型别名。

下面是一些使用typedef的例子:

cpp 复制代码
typedef int myInt; // 为int类型创建一个新的类型别名为myInt

typedef unsigned int uint; // 为unsigned int类型创建一个新的类型别名为uint

typedef float distance; // 为float类型创建一个新的类型别名为distance

typedef int* IntPtr; // 为int*类型(指向int的指针)创建一个新的类型别名为IntPtr

typedef void (*FuncPtr)(int); // 为函数指针类型创建一个新的类型别名为FuncPtr

在上述示例中,我们使用typedef关键字为不同的类型创建了新的类型别名。这些类型别名可以像普通类型一样使用,提供了更具描述性的名称,使得代码更易于理解和维护。

例如,在第一个例子中,我们为int类型创建了一个新的类型别名myInt。现在,我们可以使用myInt关键字来声明变量,就像使用int一样:

cpp 复制代码
myInt num = 10;

同样,其他的类型别名也可以按照这种方式使用。

需要注意的是,typedef只是为已存在的类型创建了一个新的名称,它并没有创建新的类型。因此,typedef并不会引入新的数据类型,只是给现有的类型起了一个别名。

示例 1:为结构体创建类型别名
cpp 复制代码
#include <iostream>

// 定义一个结构体
struct Person {
    std::string name;
    int age;
};

// 为结构体创建类型别名
typedef struct Person PersonStruct;

int main() {
    // 使用类型别名创建结构体变量
    PersonStruct person;
    person.name = "John";
    person.age = 25;

    // 输出结构体成员
    std::cout << "Name: " << person.name << std::endl;
    std::cout << "Age: " << person.age << std::endl;

    return 0;
}

在上述示例中,我们定义了一个名为Person的结构体。然后,使用typedef关键字为该结构体创建了一个新的类型别名PersonStruct。接着,在main函数中,我们使用PersonStruct类型别名来声明了一个结构体变量person,并对其进行赋值和输出。

示例 2:为函数指针创建类型别名
cpp 复制代码
#include <iostream>

// 原始的函数原型
void myFunction(int x);

// 为函数指针创建类型别名
typedef void (*FuncPtr)(int);

int main() {
    // 使用类型别名声明函数指针变量
    FuncPtr ptr = &myFunction;

    // 调用函数通过指针
    ptr(5);

    return 0;
}

// 实现函数
void myFunction(int x) {
    std::cout << "The value is: " << x << std::endl;
}

在上述示例中,我们首先定义了一个函数myFunction,它接受一个整数参数并没有返回值。然后,使用typedef关键字为该函数指针类型创建了一个新的类型别名FuncPtr。在main函数中,我们使用FuncPtr类型别名来声明了一个函数指针变量ptr,并将其指向myFunction函数。最后,通过函数指针调用了myFunction函数。

这些示例展示了typedef的使用,以便为已存在的类型创建新的类型别名。

相关推荐
?333331 分钟前
CTFHub Web进阶-PHP-Bypass disable_function攻略
开发语言·安全·web安全·php
所以经济危机就是没有新技术拉动增长了2 分钟前
二、javascript的进阶知识
开发语言·javascript·ecmascript
Bubluu13 分钟前
浏览器点击视频裁剪当前帧,然后粘贴到页面
开发语言·javascript·音视频
羑悻的小杀马特24 分钟前
【AIGC篇】畅谈游戏开发设计中AIGC所发挥的不可或缺的作用
c++·人工智能·aigc·游戏开发
闻缺陷则喜何志丹32 分钟前
【C++动态规划】1105. 填充书架|2104
c++·算法·动态规划·力扣·高度·最小·书架
AI人H哥会Java34 分钟前
【Spring】基于XML的Spring容器配置——<bean>标签与属性解析
java·开发语言·spring boot·后端·架构
开心工作室_kaic44 分钟前
springboot493基于java的美食信息推荐系统的设计与实现(论文+源码)_kaic
java·开发语言·美食
析木不会编程1 小时前
【C语言】动态内存管理:详解malloc和free函数
c语言·开发语言
神仙别闹1 小时前
基于Java2D和Java3D实现的(GUI)图形编辑系统
java·开发语言·3d
雪球不会消失了1 小时前
SpringMVC中的拦截器
java·开发语言·前端