您的位置:首页 > 编程语言 > C语言/C++

[黑马程序员]C语言结构体

2015-08-21 16:19 239 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

0x00 结构体简介

在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名为字符型;学号可为整型或字符型;年龄为整型;成绩可为整型或实型。显然,这些数据不可能用同一个数组来存放这组数据。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。

“结构”是一种构造数据类型,它由若干个“成员”组成,每个成员可以是基本数据类型或者构造类型。

什么是构造类型?

构造数据类型是根据已定义的一个或多个数据类型用构造的方法来定义的。也就是说,一个构造类型的值可以分解成若干个“元素”或“成员”,每一个“成员”都是一个基本数据类型或构造类型。

C语言中的构造类型:数组类型;结构体类型;共用体(联合)类型。

为什么要有结构体?

结构体可以把数据组织起来,存在一起,使用的时候更方便。在调用函数时,若传递的参数比较多,传一个结构体相对而言简单一些。

0x01 定义结构体

定义方式:
struct 结构名{成员1; 成员2; 成员3; ...};


example:

struct Student{
char name[20];
int age;
char sex;
};


0x02 结构体变量定义

定义结构体变量有三种方式:

先定义结构体,再定义结构体变量

定义结构体变量的同时,定义结构体变量

使用匿名结构体定义结构体变量

注意:结构体定义完毕后,计算机并不会给结构体分配内存空间;定义结构体变量后,才会分配内存空间。

struct Student{
char name[20];
int age;
char sex;
};
struct Student stu; //分别定义结构体、结构体变量


struct Student{
char name[20];
int age;
char sex;
}stu,stu1;            //定义结构体的同时,定义结构体变量


struct{
char name[20];
int age;
char sex;
}stu,stu1;            //匿名结构体定义结构体变量


0x03 结构体成员的访问方式

在程序中使用结构变量时,往往不把它作为一个整体来使用。在ANSI C中除了允许具有相同类型的结构变量相互赋值以外,一般对结构变量的使用,包括赋值、输入、输出、运算都是通过结构变量的成员来实现的。结构体变量成员访问方式一般为
变量名.成员名
;例如,
stu.name
stu.age
。如果成员本身又是一个结构体,则需要逐级找到最低级成员才能使用,如:
stu.birthday.month


0x04 结构体变量的初始化

struct Student stu1;    //先定义,后赋值
strcpy(stu1.name,"张三丰");
stu1.age = 10;
stu1.sex = '女';


struct Student stu1 = {"张三丰", 10, '女'};  //定义时初始化,赋值顺序要跟成员顺序保持一致


struct Student stu1 = {.name="张三丰"};      //指定成员初始化


0x05 结构体存储原理

结构名只能表示一个结构形式,编译系统并不会对它分配内存空间。只有当结构体变量被说明的时候,才会对该变量分配内存空间。
结构体占用的内存空间为每个成员占用的字节数之后和
,还要考虑内存对齐。

内存对齐:取结构体成员中占用最大的数据类型,每次分配内存按最大数来分配,最终占用的字节数必然是最大数的倍数。

struct A{
int a;           //占用4个字节
float b;         //占用4个字节
char c;          //占用1个字节
}


每次按4个字节分配,这个结构体占用12个字节。

struct A{
int a;           //占用4个字节
float b;         //占用4个字节
char c;          //占用1个字节
double d;        //占用8个字节
}


每次按8个字节分配,a分配8个字节,占用4个字节,由b去填充;c分配8个字节,占用1个字节,剩余7个字节;d占用8个字节,无法占用c剩下的,继续分配8个字节,总共是24个字节。有时候因为各个成员的先后顺序不一样,会影响占用的字节总数。

0x06 总结

结构体的定义和使用还是挺简单的,学习过程中没有遇到什么问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: