结构体
结构体的声明
//struct--结构体关键字 Stu--结构体标签 struct Stu 结构体类型
//定义一个结构体类型,不创建空间,类似于图纸
struct Stu
{
char name = [20];
short age;
char tele[12];
char sex[5];
}s1,s2,s3;//s1,s2,s3是三个全局的结构体变量
int main()
{
//创建结构体变量,这时才占用空间,类似于图纸澡出来的房子
struct Stu s;//局部变量
}
typedef struct Stu
{
char name = [20];
short age;
char tele[12];
char sex[5];
}Stu;
注意上面两种的区别
第二种使用了tpyedef可以方便直接写Stu s1,而不用每次都写struct Stu s1
结构体变量的定义和初始化
要知道是运用{}来完成结构体初始化的,如下面的例子
struct S
{
int a;
char c;
char arr[20];
double d;
};
struct T
{
char ch[20];
struct S s;
char arr[20];
char* pc;
};
int main()
{
char arr[] = "hello,wold\n";
struct T t = {"hehe",{100,'w',"hello",3.14},arr};
printf("%s\n",t.ch);
printf("%s\n",t.s.arr);
return 0;
}
结构体成员的访问
typedef struct Stu
{
char name = [20];
short age;
char tele[12];
char sex[5];
}Stu;
void print1(Stu tmp)
{
printf("name:%s\n",tmp.name);
printf("name:%s\n",tmp.age);
printf("name:%s\n",tmp.tele);
printf("name:%s\n",tmp.sex);
}
void print2(Stu* ps)
{
printf("name:%s\n",ps->name);
printf("name:%s\n",ps->age);
printf("name:%s\n",ps->tele);
printf("name:%s\n",ps->sex);
}
int main()
{
Stu s = {"jack",40,"13132131","男"};
print1(s);
print2(&s);
return 0;
}
用来打印结构体数据,哪个函数更好呢?
pirnt2,理由如下
print1函数 实参会开辟空间创建,同时传递给形参时,也会开辟空间,造成了空间浪费,而print2传参的时候传入的是地址,无非是4个字节活着8个字节(32位or64位)
两种访问方式
- 用.访问 结构体变量
- 用-> 结构体指针
函数穿参压栈是什么意思
每一次调用函数都会在栈上申请空间
注意穿参是从右往左传,所以先b‘,再a’