目录
结构体:相比于数组,可以由不同数据类型组成,其中的变量称为结构体的成员变量(有点像Java的类Java更细分化一点吧)
结构体的创建:
struct s//s结构体名字
{
int a;
char c[10];
double b;
//内部是结构体的特征或者说成员变量
};
struct s//s结构体名字
{
int a;
char c[10];
double b;
//内部结构体的特征或成员变量
}s1,s2;//在创建结构体的同时实例化两个对象
结构体初始化:
struct s s1 = { 1,"sdas",2.12 };
如果结构体内还有一个结构体成员初始化格式:
struct b
{
int a;
char c[10];
double b;
};
struct s//s结构体名字
{
struct b sb;
int a;
char c[10];
double b;
//内部结构体的特征或成员变量
}s1,s2;//在创建结构体的同时实例化两个对象
int main()
{
struct s s1 = { {1,"sdas",2.12},1,"sdas",2.12 };//类似于二维数组
return 0;
}
结构体的访问:
两种访问方式
1.通过结构体对象名加"."访问
int main()
{
struct s s1 = { {1,"sdas",2.12},1,"sdas",2.12 };
printf("%d",s1.a);
return 0;
}
2.结构体类型指针(就是指向结构的指针)指针对象名加"->"
int main()
{
struct s s1 = { {1,"sdas",2.12},1,"sdas",2.12 };
struct s* p = &s1;
printf("%d",p->a); //p->a == (*p).a
return 0;
}
两种输出结果都是1
结构体的传参
形参是结构体对象,把结构体对象传参过去就是值传递
int b(struct s s1)
{
printf("%d", s1.a);
return 0;
};
int main()
{
struct s s1 = { {1,"sdas",2.12},1,"sdas",2.12 };
b(s1);
}
形参是结构体指针,把结构体地址传参过去就是址传递
int a(struct s *p)
{
printf("%d,%s,%lf", p->a, p->c, p->b);
return 0;
};
int main()
{
struct s* p = &s1;
struct s s1 = { {1,"sdas",2.12},1,"sdas",2.12 };
a(&s1);
}
关于值传递和址传递扩展:
值传递相当与建立一个副本存放在形参中,在内存中就是通过传参过去对象找到地址空间把里面赋值给函数形参,形参需要开辟一块新的地址空间,所以更占内存
而址传递就是把对象的初始地址传参过去,通过地址访问其中的值,不会开辟新的空间,但是数据会暴露容易被篡改
总结:性能选址传递,安全选值传递