结构体是一些变量组合,这些变量称为“成员变量”,每个成员变量可以是不同的类型的变量。
声明
struct tag
{
member-list;
}variable-list;
typedef 为C语言的关键字,作用是为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
typedef unsigned int u_int;
示例
//1.
typedef struct Stu
{
char name[40];
int age;
char sex[2];
char id[20];
}Stu; //将 struct Stu 命名为Stu
Stu m;
//2.
struct Stu
{
char name[40];
int age;
char sex[2];
char id[20];
}stu; //声明结构体的同时定义变量stu;
struct Stu w;
结构体定义和初始化
//初始化
Stu m={"张三",12,"男"};
//嵌套初始化
struct Node
{
int x;
int y;
struct Stu stu;
struct node* next;
}node; //声明Node的同时定义变量node;
struct Node node2; //定义node2;
struct Node node3={1,2,{"张三",12,"男"},NULL};
结构体成员变量的访问
结构体名.成员变量
结构体指针名->成员变量
typedef struct std
{
char name[50];
int age;
}std;
int main()
{
std n1={"李四",21};
std*n2=&n1;
printf("%s %d",n1.name,n1.age);
printf("%s %d",n2->name,n1->age);
printf("%s %d",(*n2).name,(*n2).age);
return 0;
}
结构体作为函数参数
typedef struct std
{
char name[50];
int age;
}std;
void change1(std* j);
void change2(std j);
int main()
{
std n = { "qw",21 };
std m = { "io",12 };
std* i = &n;
change1(i);
printf("%d", i->age);
change2(i);
printf("%d", i->age);
return 0;
}
void change1(std* j) //传地址
{
std* i;
i = j;
i->age = 22;
}
void change2(std j) //传值
{
j.age=1;
}
函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈 的的系统开销比较大,所以会导致性能的下降。
小练习:
一块钱一瓶汽水,两个空瓶换一瓶汽水,现有二十块钱,共喝了几瓶汽水?
#include<stdio.h>
typedef struct drink
{
int count; //能喝的汽水数
int money; //钱数
int empty; //空瓶数
int sum; //喝的汽水总数
}drink;
void Drink(drink* d);
int main()
{
drink d = { 0,20,0,0 };
Drink(&d);
printf("%d", d.sum);
}
void Drink(drink* d)
{
d->count = d->money;
d->money = 0;
d->sum = d->count;
d->empty = d->count;
while (d->empty != 0)
{
d->count = 0;
d->count = d->empty / 2;
d->sum += d->count;
d->empty = d->count;
}
}
最难不过坚持!