目录
1.结构体的定义与产生
结构体是什么?结构体本质上是一种数据类型,但它可以包括若干个“成员”,每个成员的类型可以相同也可以不同,也可以是基本数据类型或者又是一个构造类型。所以C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,也就是结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的属性,往往是某种业务相关属性的聚合)的变量封装在内部,通过一定方法访问和修改内部变量。
结构体是怎么产生的?在实际问题中,一组数据往往有很多种不同的数据类型。例如,登记学生的信息,可能需要用到 char型的姓名,int型或 char型的学号,int型的年龄,char型的性别,float型的成绩。又例如,对于记录一本书,需要 char型的书名,char型的作者名,float型的价格。在这些情况下,使用简单的基本数据类型甚至是数组都是很困难的。而结构体则可以有效的解决这个问题。
2.结构体的使用
1.结构体的创建
我们可以直接创建一个结构体,内部可以包含数组,整形,浮点型...甚至还可以是另一个结构体,这些内部的数据类型称为结构体成员,但是要注意一定不要初始化任何一个结构体成员。
我们在创建结构体的同时还可以自由修改该结构体的名称。
typedef struct stu//前面加上typedef
{
char name[10];
int grade;
double hight;
double weight;
}stu;//后面加上修改后的名称(在分号里面)
. 注意:结构体创建时并不会在内存中开辟空间,创建结构体变量时才会开辟空间。
这样我们便创建了一个结构体。
2.结构体变量的创建和使用
我们可以在创建结构体的同时创建结构体变量
struct Str
{
char name[20];
int age;
char id[9];
}s1,s2;//注意在分号里面呀!
也可以在主函数内部创建,创建方法和普通的数据类型相同(数据类型+变量名称+赋值),使用时在变量名称后面加上一个点,再选择具体结构体成员
int main()
{
stu s1 = { "小明", 140, 180.5, 144.5 };//字符串用“”,字符用‘’
printf("%s\n", s1.name);
printf("%d\n", s1.grade);
printf("%.1f\n", s1.hight);
printf("%.1f\n", s1.weight);
return 0;
}
3.结构体与指针
我们利用指针也可以访问结构体成员,方法和普通指针的使用方法类似:结构体类型+*ps=&结构体变量,与数组相同,这个地址也是结构体变量的第一个结构体成员的地址。
struct Str
{
char name[20];
int age;
char id[9];
};
int main()
{
struct Str s1 = { "小明", 12, "20090102" };//成员变量.成员名
struct Str*ps = &s1;//取出地址存入指针
printf("%d", (*ps).age);
printf("%d", ps->age);//同上等价
printf("%d", s1.age);//同上等价
return 0;
}
我们使用指针时用指针变量p指向结构体成员,短横线+大于号就像一个形象的箭头,很好理解。
4.结构体传参
由于结构体包含多个数据类型,当我们将一个结构体变量传入函数中需要创建一个临时的拷贝,会占用较大空间,于是我们选择将结构体的地址传入函数,用指针完成对结构体变量的操作,避免了空间的占用。
typedef struct stu
{
char name[10];
int grade;
double hight;
double weight;
}stu;
void print(stu*ps1)
{
printf("%s\n",ps1->name);
printf("%d\n",ps1->grade) ;
printf("%.1f\n", ps1->hight);
printf("%.1f\n", ps1->weight);
}
int main()
{
stu s1 = { "小明", 140, 180.5, 144.5 };
print(&s1);
return 0;
}