C++函数——函数和复杂类型(数组、结构体、string对象)

本文介绍了如何在C++中使用函数处理数组、结构体和string对象。重点讲解了数组作为参数时的实际意义及其在函数中的应用,包括求和、填充、比例分配及显示等功能。同时,也探讨了结构体和string对象作为参数的处理方式。
函数与数组

    数组作为参数: int sum_arr(int arr[], int n);

    arr是数组名, 但arr实际上并不是数组, 而是一个指针, 指向数组的第一个元素。 但是在编写函数的其余部分时,可以将arr看作是数组。

    当且仅当用于函数头或函数原型中, int *arr和int arr[]的含义才是相同的。 它们都意味着arr是一个int指针。 然而, 数组表示法提醒用户, arr不仅指向int, 还指向int数组的第一个int。

    填充数组或修改数组: 由于接收数组名参数的函数访问的是原始数组(使用指针访问), 而不是其副本, 因此可以通过调用该函数将值赋给数组元素, 或是修改数组元素的值。

    显示数组以及保护数组: 为了确保显示函数不修改原始数组, 可在声明形参时使用关键字const

     二维数组: int sum(int ar2[][4], int size);

#include<iostream>
#include<string>

using namespace std;
int sum_arr(const int arr[], int n);
void fill_arr(int arr[], int n);
void ratio(int arr[], int n, int sum);
void print_arr(const int arr[], int n);

int main()
{
    const int size = 6;
    int student1[size] = {120, 110, 100, 90, 85, 95};
    int totalScore = sum_arr(student1, size);
    cout << "该名学生的总成绩为: " << totalScore << endl;

    int student2[size] = {};
    fill_arr(student2, size);
    totalScore = sum_arr(student2, size);
    cout << "该学生的各科成绩为: " << endl;
    print_arr(student2, size);
    ratio(student2, size, totalScore);
    cout << "各科成绩所占百分比(%): " << endl;
    print_arr(student2, size);

    return 0;
}

//arr是一个指针,指向数组的第一个元素。const int类型,所以不能修改数组内的值。
//n是数组的大小
//在函数体内,可以将arr直接当做数组名来使用,*arr和arr[]的意义相同。
int sum_arr(const int arr[], int n)
{
    int res = 0;
    for (int i = 0; i < n; i++)
    {
        res += arr[i];
    }
    return res;
}

void fill_arr(int arr[], int n)
{
    cout << "请输入该学生的成绩(语数外物化生): " << endl;
    int temp;
    for (int i = 0; i < n; i++)
    {
        cin >> temp;
        arr[i] = temp;
    }
}

void ratio(int arr[], int n, int sum)
{
    for (int i = 0; i < n; i++)
    {
        arr[i] = arr[i] * 100 / sum;
    }
}

void print_arr(const int arr[], int n)
{
    for (int i = 0; i < n; i++)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
}
函数与结构体

    使用结构编程时, 最直接的方式是像处理基本类型那样来处理结构, 也就是说, 将结构作为参数传递, 并在需要时将结构用作返回值使用。

    如果结构非常大, 则复制结构将增加内存要求, 降低系统运行的速度, 这种情况下, 应使用指针来访问结构的内容,或按引用进行传递。

#include<iostream>

using namespace std;

struct WorkTime
{
    int hours;
    int mins;
};
WorkTime sum(WorkTime t1, WorkTime t2);
const int Mins_per_hour = 60;
int main()
{
    WorkTime morning = { 2 ,40 };
    WorkTime afternoon = { 6, 40 };
    WorkTime day = sum(morning, afternoon);
    cout << "一天一共工作了: " << day.hours << "小时," << day.mins << "分钟。" << endl;
    return 0;
}

//结构体在函数中可以和基本类型一样使用,作为参数传递或者是作为返回值返回
//结构体较大时,为了避免复制副本,可以使用指针或引用类型
WorkTime sum(WorkTime t1, WorkTime t2)
{
    WorkTime total;
    total.mins = (t1.mins + t2.mins) % Mins_per_hour;
    total.hours = t1.hours + t2.hours + (t1.mins + t2.mins) / Mins_per_hour;
    return total;
}
函数与string对象

    与结构相似, 可以将string对象作为完整的实体进行传递。string对象也可以像基本类型那样, 作为参数传递, 并作为返回值使用。

    如果需要多个字符串, 可以声明一个string对象的数组。

#include<iostream>
#include<string>

using namespace std;

void fill_games(string name[], int n);
void print_games(const string name[], int n);

int main()
{
    const int size = 5;
    cout << "请输入" << size << "个你喜欢的游戏的名称: " << endl;
    string gameNames[size] = {};
    fill_games(gameNames, size);
    print_games(gameNames, size);
    return 0;
}

void fill_games(string name[], int n)
{
    for (int i = 0; i < n; i++)
    {
        getline(cin, name[i]);
    }
}

void print_games(const string name[], int n)
{
    for (int i = 0; i < n; i++)
    {
        cout << i + 1 << ": " << name[i] << endl;
    }
}

<think>首先,用户的问题是:“我想在C++中如何定义创建结构体数组 请问C++ define create array of structs example”。这是一个关于C++编程的问题,具体是如何定义创建结构体数组。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。但在这个问题中,没有数学表达式,所以可能不需要。 - 独立公式必须使用$$...$$格式并单独成段。同样,这里可能不适用。 - LaTeX语法正确:确保在需要时使用。 - 使用中文回答:整个回答应该用中文。 - 生成相关问题:在回答后,添加相关问题。 - 回答中引用的段落末尾自然地添加引用标识:但用户没有提供引用,所以如果引用站内内容,需要添加。用户提供了几个引用,但它们是关于C#、方法重载thrift的,不是直接相关的。用户说“上述引用仅供参考”,所以我应该基于C++本身来回答,而不是硬套引用。 用户提供的引用: - 引用[1]:关于C#中的结构体,使用fixed数组。 - 引用[2]:关于语法相似性。 - 引用[3]:关于方法重载构造函数调用。 - 引用[4]:关于thrift框架。 这些引用与用户的问题不直接相关,用户的问题是关于C++结构体数组的。所以,我应该忽略这些引用,除非有直接联系。用户说“请尽可能多的参考用户上一次的问题你的回答”,但这是新对话的开始(基于上下文),所以没有上一次问题。因此,我应该直接回答当前问题。 回答结构: - 帮助用户逐步解决问题:结构清晰,分步骤解释。 - 保证回答真实可靠:基于C++标准知识。 关键点: - 定义结构体:使用`struct`关键字。 - 创建结构体数组:使用数组声明,如`struct_name array_name[size];`或动态分配。 步骤: 1. 定义结构体:例如,定义一个简单的结构体。 2. 创建静态数组:固定大小的数组。 3. 创建动态数组:使用`new`或智能指针。 4. 初始化数组:如何初始化结构体数组的元素。 5. 示例代码:提供代码示例。 用中文回答。 生成相关问题:在最后添加相关问题,如关于数组操作、动态内存管理等。 最终回答结构: - 介绍:简要解释结构体数组。 - 步骤:分步解释如何定义创建。 - 示例代码:提供C++代码示例。 - 相关问题:列出相关问题。 示例代码格式:在代码块中,使用` ```cpp `。 确保回答真实可靠:C++标准知识,没有错误。</think>### C++ 中定义创建结构体数组的指南 在 C++ 中,结构体(struct)是一种用户自定义的数据类型,允许你将多个相关变量组合成一个单元。结构体数组则是存储多个结构体实例的数组,常用于管理一组相似的数据记录(如学生信息、坐标点等)。下面我将分步骤解释如何定义结构体创建结构体数组,并提供代码示例。整个过程基于 C++ 标准(如 C++11 或更高版本),确保代码可靠。 #### 步骤 1: 定义结构体 首先,你需要使用 `struct` 关键字定义一个结构体类型结构体可以包含多个成员变量(如整型、字符型等)。定义后,你可以像内置类型一样使用它。 ```cpp // 定义一个简单的结构体,例如表示学生信息 struct Student { int id; // 学生ID std::string name; // 学生姓名 float score; // 分数 }; ``` - **注意**:在 C++ 中,结构体定义通常放在全局作用域或头文件中,以便在多个文件中使用。成员变量可以是任何数据类型,包括数组或其他结构体。 #### 步骤 2: 创建结构体数组 创建结构体数组有两种常见方式:**静态数组**(固定大小,编译时确定)**动态数组**(运行时动态分配内存)。下面分别说明。 1. **静态数组**:使用固定大小声明数组数组大小在编译时确定,适用于已知元素数量的场景。 ```cpp // 创建静态结构体数组(大小为 3) Student students[3]; // 定义一个包含 3 个 Student 结构体数组 ``` 2. **动态数组**:使用 `new` 运算符动态分配内存,适用于大小在运行时确定的场景。记得使用 `delete[]` 释放内存以避免内存泄漏。 ```cpp // 创建动态结构体数组 int size = 5; // 运行时确定大小 Student* dynamicStudents = new Student[size]; // 动态分配数组 // 使用后释放内存 delete[] dynamicStudents; ``` - **优化建议**:在现代 C++ 中,推荐使用智能指针(如 `std::unique_ptr`)或标准库容器(如 `std::vector`)来管理动态数组,避免手动内存管理错误。例如: ```cpp #include <vector> std::vector<Student> studentsVector; // 使用 vector 动态管理结构体数组 ``` #### 步骤 3: 初始化结构体数组 初始化数组元素时,可以直接在声明时赋值,或通过循环逐个赋值。以下是常见方法: - **直接初始化**(静态数组): ```cpp Student students[3] = { {1, "Alice", 90.5}, // 第一个元素 {2, "Bob", 85.0}, // 第二个元素 {3, "Charlie", 92.3} // 第三个元素 }; ``` - **循环初始化**(动态数组): ```cpp for (int i = 0; i < size; ++i) { dynamicStudents[i].id = i + 1; dynamicStudents[i].name = "Student" + std::to_string(i + 1); dynamicStudents[i].score = 75.0 + i * 5; } ``` #### 完整示例代码 以下是一个完整的 C++ 示例,展示如何定义结构体、创建静态动态数组,并访问元素: ```cpp #include <iostream> #include <string> #include <vector> // 用于 vector 示例 // 步骤 1: 定义结构体 struct Student { int id; std::string name; float score; }; int main() { // 步骤 2: 创建静态数组并初始化 Student staticStudents[2] = { {101, "Tom", 88.5}, {102, "Jerry", 92.0} }; // 访问静态数组元素 std::cout << "静态数组示例:\n"; std::cout << "学生姓名: " << staticStudents[0].name << ", 分数: " << staticStudents[0].score << "\n"; // 步骤 2: 创建动态数组 int dynamicSize = 3; Student* dynamicStudents = new Student[dynamicSize]; // 初始化动态数组 for (int i = 0; i < dynamicSize; ++i) { dynamicStudents[i] = {201 + i, "Dynamic" + std::to_string(i), 70.0 + i * 10}; } std::cout << "\n动态数组示例:\n"; std::cout << "学生 ID: " << dynamicStudents[1].id << "\n"; // 释放动态数组内存 delete[] dynamicStudents; // 使用 std::vector 更安全的动态数组 std::vector<Student> studentsVector; studentsVector.push_back({301, "Eve", 95.5}); // 添加元素 studentsVector.push_back({302, "John", 89.0}); std::cout << "\nVector 示例:\n"; std::cout << "学生姓名: " << studentsVector[0].name << "\n"; return 0; } ``` - **运行说明**:编译时需支持 C++11 或更高版本(例如使用 `g++ -std=c++11 your_file.cpp`)。此代码输出数组元素信息,演示了基本操作。 - **关键点**: - 静态数组简单高效,但大小固定。 - 动态数组灵活,但需手动管理内存;推荐优先使用 `std::vector` 以避免内存错误[^1]。 - 结构体数组在游戏开发、数据库模拟等场景中常见,用于高效存储结构化数据。 ### 相关问题 1. 如何在 C++ 中初始化结构体数组的元素? 2. 使用 `std::vector` 管理结构体数组有什么优势? 3. 结构体数组与类数组C++ 中有什么区别? [^1]: 在 C++ 中,`std::vector` 提供自动内存管理,减少内存泄漏风险,类似于其他语言中的动态数组实现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值