自定义类型:结构体

1. 结构体

结构体(struct)是有一系列具有相同类型或不同类型的数据构成的数据集合.是一种数据结构!这些数据被称为成员变量。
结构体成员可以是:标量,数组,指针或其他结构体。

结构体声明
例:

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

这里声明了一个student类结构体。它包含了3个成员变量——name,age,sex。
在声明一个结构体时也可以不完全声明!

struct 
   {
   int a;
   int arr[10];
char arr1[10];
}x; //匿名结构体

结构体也可以在某个函数内部声明,但这个结构体只能在该函数中使用!

结构体变量的定义

  1. 在声明时同时定义结构体变量
struct student
{ 
         char name[20];
         int age;
         char sex[5];
}stu1,stu2;//声明的同时定义了结构体变量stu1,stu2。

2.在函数内部定义

struct student
{
         char name[20];
         int age;
         char sex[5];
};
int main()
{
    struct student stu1, stu2;
    //定义变量stu1,stu2。
    return 0;
}

结构体成员的访问
结构体变量访问结构体成员是通过操作符“ . ” 来实现的。

struct stu
{
         char name[20];
         int age;
         char sex[5];
};
int main()
{
    struct stu s1;
    strcpy(s1.name,"葫芦娃");
    s1.age = 20;
    strcpy(s1.sex,"男");
    return 0;
}

若我们得到的是结构体指针,我们可以这样访问:

struct stu
{
    char name[20];
    int age;
    char sex[5];
};
void print(struct stu *pc)
{
    printf("%s\n",*(pc).name);
    printf("%d\n",*(pc).age);
    printf("%s\n",pc->sex);
}

结构体的自引用
例子:

struct node
{
    int data;
    struct node *next;
};

结构体不完整声明

struct A                             
{
 int a;
 struct B* b;
}
struct B
{
 int b;
 struct A* a;
}
//错误写法

正确写法如下:

struct B;
struct A                             
{
 int a;
 struct B* b;
}
struct B
{
 int b;
 struct A* a;
}

结构体变量的初始化

struct stu
{
    char name[20];
    int age;
    char sex[5];
}s1 = {"葫芦娃",20,"男"};//声明时定义结构体变量s1并初始化
//
//
struct stu
{
    char name[20];
    int age;
    char sex[5];
};
struct stu s2 = {"葫芦娃娃",20,"女"};

结构体对齐

struct s1
{
 char c1;
 int c2;
 char c3;
};

printf("%d\n",sizeof(struct s1));//  12

//
//
struct s2
{
 char c1;
 char c3;
 int c2;
};

printf("%d\n",sizeof(struct s2));//  8
//
//
struct s3
{
 double c1;
 char c2;
 int c3;
};
printf("%d\n",sizeof(struct s3));//  16
//
//
struct s4
{
 char c1;
 struct s3 s;
 double i;
};
printf("%d\n",sizeof(struct s4));//  32

结构体内存对齐方法
1.第一个成员在与结构体变量偏移量为0的地址处。
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址。对齐数 = 编译器默认对齐数与该成员大小的较小值。Windows 默认8 linux默认4。
3.结构体总大小为所有成员中的最大对齐数的整数倍!
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处。

结构体传参!

结构体传参直接传地址,不跟你多废话!

位段
位段的声明跟结构体一样,但有两个不同:
位段的成员数据类型必须是 int ,unsigned int 或 signed int,char。
位段的成员后面必须跟冒号“:” 和一个数字。

struct i
{
    unsigned int a:12int b:16;
    signed int c:32;
};//冒号后的数字的范围是根据 数据类型来确定的!(int(32b),char(8b))

printf(“%d\n”,sizeof(struct i));

位段的内存分配
位段的成员数据类型是 int ,unsigned int 或 signed int,char。
位段的空间开辟是以4B(int)或1B(char)来开辟的。
位段不支持跨平台使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值