目录
结构体
结构体的声明
结构的基础知识
结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量
结构的声明
struct name //name结构体标签 struct结构体关键字 struct name-结构体类型
{
member;//成员变量
}; //此处的“;”不能少
#include <stdio.h>
struct game //创建结构体类型
{ //成员变量
char name[20];
int age_restrictions;
char type[20];
}a1, a2, a3; //a1,a2,a3为全局变量,为game结构变量
int main()
{
struct game s1 = { "Steins;Gate",15,"Galgame" }; //结构变量的创建,变量为s1
return 0;
}
#include <stdio.h>
typedef struct game //typedef可重新将类型起个名字
{
char name[20];
int age_restrictions;
char type[20];
}Gal; //重新起的名字
int main()
{
struct game s1 = { "Steins;Gate",15,"Galgame" };
Gal s2 = { "Clannad",0,"Galgame" }; //用Gal也可以创建变量
return 0;
}
结构成员类型
标量、数组、指针……甚至可以是其他结构体
结构体变量的定义和初始化
定义变量
#include <stdio.h>
struct Limit
{
int a;
int b;
}L1; //声明类型同时定义变量L1
int main()
{
struct Limit L2; //定义变量L2
return 0;
}
变量初始化
#include <stdio.h>
struct Limit
{
int a;
int b;
}L1 = { 1,2 }; //初始化L1
int main()
{
struct Limit L2 = { 3,4 }; //初始化L2,结构体成员之间用“,”隔开
return 0;
}
结构体成员有结构体时的初始化及访问
#include <stdio.h>
struct game
{
char name[20];
int age_restrictions;
char type[20];
};
struct computer
{
struct game g1;
int SSD;
};
int main()
{
struct computer PC = { {"Steins;Gate",15,"Galgame"},1000 };
//结构体类型computer中有结构体类型game,则在创建结构体computer的变量时,需再用{ }来初始化
printf("%s\n", PC.g1.name); //打印结构体中的结构体成员时就用多个“.”
return 0;
}
结构体成员的访问
结构体变量访问成员时通过操作符“.”来访问
结构体指针访问指向变量的成员,有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针,此时可用“->”来访问,详见:C语言-操作符-结构成员
结构体传参
#include <stdio.h>
typedef struct Game
{
char name[20];
int age_restrictions;
char type[20];
}Gal;
void Printf1(Gal game)
{
printf("%s\n", game.name);
printf("%d\n", game.age_restrictions);
printf("%s\n", game.type);
}
void Printf2(Gal* game)
{
printf("%s\n", game->name);
printf("%d\n", game->age_restrictions);
printf("%s\n", game->type);
}
int main()
{
Gal g1 = { "Steins;Gate",15,"Galgame" };
Printf1(g1); //调用函数,进行了传参,g1 和 &g1 都能进行传参
Printf2(&g1); //Printf2 空间利用率更高,且运行效率更高
return 0;
}
函数传参时,参数需要压栈(栈是先进后出、后进先出,插入一个元素叫 压栈,删除一个元素叫 出栈),如果传递一个结构体对象时,结构体过大,参数压栈会使系统开销变大
栈区:存放局部变量、函数的形式参数,函数调用也会开辟空间
堆区:进行动态内存分配
静态区:存放全局变量、静态变量
总结
结构体传参时,要传结构体地址
资料
《函数栈帧的创建和销毁》