目录
一、结构体
一)结构体是什么
数组:一群相同类型元素集合。
int arr[10]={1,2,3,4,5,6,7,8,9,10};
char ch[10]="hello";
结构体:一群元素的集合,不一定是相同类型的。
二)结构体的声明、定义、初始化
//结构体的定义
struct Cat{
char name[20];
double weight;
int age;
}c;//c是全局变量
int main(){
//m是局部变量
//结构体的初始化
struct Cat m={"lucky",14.5,2};
return 0;
}
三)结构体的嵌套与访问
#include<stdio.h>
//结构体的嵌套
struct Cat{
char name[20];
double weight;
int age;
}
struct Stu{
char name[20];
int age;
char id[20];
struct Cat m;
}
int main(){
//初始化
struct Stu s={"Amy",20,"209200201",{"lucky",14.5,2}};
//结构体的访问
printf("%s %d %s %s %lf %d",s.name,s.age,s.id,s.m.name,s.m.weight,s.m.age);
struct Stu* ps=&s;
printf("%s %d %s %s %lf %d",(*ps).name,(*ps).age,(*ps).id,(*ps).m.name,(*ps).m.weight,(*ps).m.age);
printf("%s %d %s %s %lf %d",ps->name,ps->age,ps->id,ps->m.name,ps->m.weight,ps->m.age);
return 0;
}
四)结构体传参方式
//函数传参
1.
#include<stdio.h>
void print(struct Stu s){
printf("%s %d %s %s %lf %d",s.name,s.age,s.id,s.m.name,s.m.weight,s.m.age);
}
int main(){
print(s);
return 0;
}
2.#include<stdio.h>
void print(struct Stu *ps){
printf("%s %d %s %s %lf %d",ps->name,ps->age,ps->id,ps->m.name,ps->m.weight,ps->m.age);
}
int main(){
print(&s);
return 0;
}
你觉得以上哪种方式函数传参比较好?
第一种是传值调用,第二种是传址调用。
传址调用比传值调用更好,因为函数传参时要参数压栈,传址调用更省空间、时间,效率更高。
二、参数压栈
内存分配分为三种,栈区,堆区,静态区。
#include <stdio.h>
int ADD(int x,int y){
int z=x+y;
return z;
}
int main(){
int a=3;
int b=5;
int c=ADD(a,b);
printf("%d",c);
return 0;
}
栈帧创建
一)函数每一次调用都需要在栈区开辟一块新的空间。
1.main函数需要开辟一块空间
2.a,b,c按先后顺序在main函数空间里占一块空间
二)栈区先进后出,后进先出。
形参传值是从后往前传的。
ADD函数也需要开辟一块空间。
栈帧销毁
一)当z的值返回到主函数,ADD函数栈帧销毁。
二)当主函数返回0,主函数栈帧销毁。
所以当结构体过大时,再用传值调用,参数压栈的系统开销过大,影响性能,所以结构体函数传参是传址调用。
以上就是我今天的分享,谢谢观看!!!如果有什么错误或者建议,欢迎评论区留言!