结构体是一种自定义的数据类型,用结构体可以创建结构体变量。
1)基本语法
在C++中,用不同类型的指针存放不同类型变量的地址,这一规则也适用于结构体。如下:
struct st_girl girl; // 声明结构体变量girl。
struct st_girl *pst=&girl; // 声明结构体指针,指向结构体变量girls。
通过结构体指针访问结构体成员,有两种方法:
(*指针名).成员变量名 // (*pst).name和(*pst).age
或者:
指针名->成员变量名 // pst->name和*pst->age
在第一种方法中,圆点.的优先级高于*,(*指针名)两边的括号不能少。如果去掉括号写成(*指针名).成员变量名,那么相当于*(指针名.成员变量名),意义就完全不一样了。
在第二种方法中,->是一个新的运算符。
上面的两种方法是等效的,程序员通常采用第二种方法,更直观。
注意:与数组不一样,结构体变量名没有被解释为地址。
2)用于函数的参数
如果要把结构体传递给函数,实参取结构体变量的地址,函数的形参用结构体指针。
如果不希望在函数中修改结构体变量的值,可以对形参加const约束。
3)用于动态分配内存
用结构体指针指向动态分配的内存的地址。
示例:
#include <iostream>
#include <string>
#include <cstdlib> // 包含malloc和free
// 定义结构体
struct st_girl {
std::string name;
int age;
};
// 函数声明,使用结构体指针作为参数,参数前加const以防止修改实参
void displayGirl(const st_girl* girl) {
std::cout << "Name: " << girl->name << ", Age: " << girl->age << std::endl;
}
int main() {
// 静态分配结构体变量
st_girl girl1 = {"Alice", 20};
// 创建结构体指针并指向静态分配的结构体变量
st_girl *pst = &girl1;
// 通过指针访问并显示结构体成员
std::cout << "Using pointer access: " << std::endl;
displayGirl(pst);
// 动态分配结构体变量
st_girl *pgirl = (st_girl*)malloc(sizeof(st_girl));
if (pgirl == nullptr) {
std::cerr << "Memory allocation failed." << std::endl;
return 1;
}
// 初始化动态分配的结构体
pgirl->name = "Betty";
pgirl->age = 22;
// 通过指针访问并显示结构体成员
std::cout << "Using dynamic memory allocation: " << std::endl;
displayGirl(pgirl);
// 释放动态分配的内存
free(pgirl);
return 0;
}
上述代码展示了以下几个重要的概念:
- 结构体的声明与使用:定义了一个名为
st_girl
的结构体,包含字符串name
和整数age
。 - 静态与动态内存管理:静态分配使用在栈上定义的变量
girl1
,动态分配使用malloc
在堆上创建。 - 函数参数传递:通过指针将结构体传递给函数
displayGirl
,在函数定义时用const
确保不会修改传入的结构体。 - 指针访问:使用
->
操作符直接访问结构体成员。