C/C++ 数组允许定义可存储相同类型数据项的变量,但是结构是 C++ 中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。 结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性:
- Title :标题
- Author :作者
- Subject :类目
- Book ID :书的 ID
定义结构
为了定义结构,您必须使用struct语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
struct type_name {member_type1 member_name1;member_type2 member_name2;member_type3 member_name3;..} object_names;
type_name是结构体类型的名称
member_type1 member_name1是标准的变量定义,比如int i;或者float f;或者其他有效的变量定义。
在结构定义的末尾,最后一个分号之前,您可以指定一个或多个结构变量,这是可选的。
下面是声明一个结构体类型Books,变量为book:
struct Books{char title[50];char author[50];char subject[100];int book_id;} book;
struct Books book//或者Books book
结构体赋值
#include <iostream>#include <string>using namespace std;struct Books{char title[50];char author[50];string subject;int book_id = 123456; //默认值} book;int main(int argc, char const *argv[]){Books book1; //可以省略 structstrcpy( book1.title, "C++ 教程");strcpy( book1.author, "一缕清风");book1.subject = "编程语言";book1.book_id = 123456;struct Books book2 = {"C语言","kenguba","高级语言",123456};}
访问结构成员
为了访问结构的成员,我们使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。
下面的实例演示了结构的用法:
#include <iostream>#include <cstring>using namespace std;// 声明一个结构体类型 Booksstruct Books{char title[50];char author[50];char subject[100];int book_id;};int main(){Books book1; // 定义结构体类型 Books 的变量 book1Books book2; // 定义结构体类型 Books 的变量 book2// book1 详述strcpy(book1.title, "C++ 教程");strcpy(book1.author, "一缕清风");strcpy(book1.subject, "编程语言");book1.book_id = 123456;// book2 详述strcpy(book2.title, "CSS 教程");strcpy(book2.author, "一缕清风");strcpy(book2.subject, "前端技术");book2.book_id = 123457;// 输出 book1 信息cout << "第一本书标题 : " << book1.title << endl;cout << "第一本书作者 : " << book1.author << endl;cout << "第一本书类目 : " << book1.subject << endl;cout << "第一本书 ID : " << book1.book_id << endl;// 输出 book2 信息cout << "第二本书标题 : " << book2.title << endl;cout << "第二本书作者 : " << book2.author << endl;cout << "第二本书类目 : " << book2.subject << endl;cout << "第二本书 ID : " << book2.book_id << endl;strcpy(book1.author, "Kebguba");strcpy(book2.author, "Kebguba");cout << "第一本书作者 : " << book1.author << endl; //Kebgubacout << "第二本书作者 : " << book2.author << endl; //Kebgubareturn 0;}/*第一本书标题 : C++ 教程第一本书作者 : 一缕清风第一本书类目 : 编程语言第一本书 ID : 123456第二本书标题 : CSS 教程第二本书作者 : 一缕清风第二本书类目 : 前端技术第二本书 ID : 123457第一本书作者 : Kebguba第二本书作者 : Kebguba*/
结构作为函数参数 (传值形式)
您可以把结构作为函数参数,传参方式与其他类型的变量或指针类似。您可以使用上面实例中的方式来访问结构变量:
#include <iostream>#include <cstring>using namespace std;void printBook(struct Books book);// 声明一个结构体类型 Booksstruct Books{char title[50];char author[50];char subject[100];int book_id;};int main(){Books book1; // 定义结构体类型 Books 的变量 book1Books book2; // 定义结构体类型 Books 的变量 book2// book1 详述strcpy(book1.title, "C++ 教程");strcpy(book1.author, "一缕清风");strcpy(book1.subject, "编程语言");book1.book_id = 123456;// book2 详述strcpy(book2.title, "CSS 教程");strcpy(book2.author, "一缕清风");strcpy(book2.subject, "前端技术");book2.book_id = 123457;printBook(book1); // 输出 book1 信息printBook(book2); // 输出 book2 信息cout << "书作者 : " << book1.author << endl; //一缕清风cout << "书作者 : " << book2.author << endl; //一缕清风return 0;}void printBook(struct Books book){cout << "书标题 : " << book.title << endl;cout << "书作者 : " << book.author << endl;cout << "书类目 : " << book.subject << endl;cout << "书 ID : " << book.book_id << endl;strcpy(book.author, "Kenguba");cout << "书作者 : " << book.author << endl; //Kenguba}/*书标题 : C++ 教程书作者 : 一缕清风书类目 : 编程语言书 ID : 123456书作者 : Kenguba书标题 : CSS 教程书作者 : 一缕清风书类目 : 前端技术书 ID : 123457书作者 : Kenguba书作者 : 一缕清风书作者 : 一缕清风*/
指向结构的指针 (地址传递)
您可以定义指向结构的指针,方式与定义指向其他类型变量的指针相似,如下所示:
struct Books *struct_pointer;
现在,您可以在上述定义的指针变量中存储结构变量的地址。为了查找结构变量的地址,请把 & 运算符放在结构名称的前面,如下所示:
struct_pointer = &Book1;
为了使用指向该结构的指针访问结构的成员,您必须使用 -> 运算符,如下所示:
struct_pointer->title;
让我们使用结构指针来重写上面的实例,这将有助于您理解结构指针的概念:
#include <iostream>#include <cstring>using namespace std;void printBook(struct Books *book);struct Books{char title[50];char author[50];string subject;int book_id;};int main(){struct Books book1 = {"C++ 教程", "Runoob", "编程语言", 12345};Books book2;strcpy(book2.title, "CSS 教程");strcpy(book2.author, "Runoob");book2.subject = "前端技术";book2.book_id = 12346;printBook(&book1); // 通过传 book1 的地址来输出 book1 信息printBook(&book2); // 通过传 book2 的地址来输出 book2 信息cout << "书作者 : " << book1.author << endl; //Kengubacout << "书作者 : " << book2.author << endl; //Kengubareturn 0;}// 该函数以结构指针作为参数void printBook(struct Books *book){cout << "书标题 : " << book->title << endl;cout << "书作者 : " << book->author << endl;cout << "书类目 : " << book->subject << endl;cout << "书 ID : " << book->book_id << endl;strcpy(book->author, "Kenguba");cout << "书作者 : " << book->author << endl; //Kenguba}/*书标题 : C++ 教程书作者 : Runoob书类目 : 编程语言书 ID : 12345书作者 : Kenguba书标题 : CSS 教程书作者 : Runoob书类目 : 前端技术书 ID : 12346书作者 : Kenguba书作者 : Kenguba书作者 : Kenguba*/
结构体数组
#include <iostream>#include <string>using namespace std;struct Student{string name; //姓名int age; //年龄int score; //分数};typedef struct Stu{string name; //姓名int age; //年龄int score; //分数} S;int main(int argc, char const *argv[]){Student s1; //可以省略structs1.name = "一缕清风";s1.age = 18;s1.score = 99;cout << s1.age << "岁的" << s1.name << "的分数是" << s1.score << endl;S arr[3] = {{"张三", 18, 80},{"李四", 32, 92},{"王五", 14, 100},};arr[0].name = "一缕清风"; //修改结构体数组的某项名字的值for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){cout << arr[i].name + "\t" << arr[i].age << "\t" << arr[i].score << endl;}}/*一缕清风 18 80李四 32 92王五 14 100*/
typedef 关键字
下面是一种更简单的定义结构的方式,您可以为创建的类型取一个”别名”。例如:
typedef struct Books{char title[50];char author[50];char subject[100];int book_id;} Books;
现在,您可以直接使用Books来定义Books类型的变量,而不需要使用 struct 关键字。下面是实例:
Books Book1, Book2;
您可以使用typedef关键字来定义非结构类型,如下所示:
typedef long int *pint32;pint32 x, y, z;
x, y 和 z 都是指向长整型 long int 的指针。
