结构体
2016-11-18 本文已影响1人
Coder007
结构体定义格式
/*
struct 结构体类型名称
{
属性;
};
*/
struct Person
{
char *name;
int age;
double height;
};
定义结构体变量
// 定义变量
struct Person p;
结构体初始化
// 定义的同时初始化
struct Person p = {"yaof", 20, 180.0};
// 先定义再初始化(逐个初始化)
struct Person p;
p.name = "yaof";
p.age = 20;
p.height = 180.0;
// 先定义再初始化(一次性初始化)
// 特别注意:需要进行强制转换,需要明确的告诉系统这个是结构体
struct Person p;
p = (struct Person){"yaof", 20, 180.0};
// 指定将数据赋值给指定的属性
struct Person p = {.age = 20, .name = "yaof", .height = 180.0};
结构体内存分析
-
定义结构体类型并不会分配存储空间
-
只有定义结构体变量才会真正的分配存储空间
-
结构体名称并不是结构体地址
-
结构体的地址就是他第0个属性的地址
-
结构体是如何分配存储空间的
-
结构体会先找到所有属性中占用内存空间最大的那个属性,然后按照该属性的倍数来分配存储空间
-
找到结构体中占用存储空间最大的,比如占用m个字节
-
会从第0个属性开始分配存储,第一个属性存储进去
-
如果还有剩余空间,如果能存下第1个属性,那么就将第一个属性存储进去
-
如果存不下,就会重新分配m个字节,并且会将当前属性直接存储到新分配的空间中,前一个剩下的存储空间就不要了
-
使用属性中占用存储空间最大的属性的字节来分配存储空间是为了提高计算机运算速度
定义结构体变量的方式
// 先定义结构体类型,再定义结构体变量
struct Person
{
int age;
char *name;
};
struct Person p;
// 定义结构体类型的同时定义结构体变量
struct Person
{
int age;
char *name;
} p;
// 定义结构体类型的同时定义结构体变量,并且省略结构体名称
// 弊端:没有名称,不能重复使用
// 优点:如果结构体只使用一次,可以使用该方法
struct
{
int age;
char *name
}p;
指向结构体的指针
// 定义一个指向结构体的指针
struct Person *sip;
sip = &p;
// 注意:如果想使用*sip代替p访问结构体属性的时候,需要加上括号(*sip)
// 因为运算符优先级:.的优先级比*高
(*sip).age = 30;
// 还有另一种访问属性的方式
// 结构体指针变量名称 -> 属性
sip -> age = 40;
sip -> name = "yaofc";
结构体数组
struct Person
{
int age;
char *name;
};
struct Person pps[2] = {
{20, "zhao"},
{30, "qing"}
};
pps[0].age = 30;
pps[1].age = 40;
值传递
// 结构体传值是值传递
struct Person
{
int age;
char *name;
};
struct Person p1 = {20, "zhao"};
// 这样传值是值传递,修改p2属性值,与p1无关
struct Person p2 = p1;