c语言中的结构体

c语言中的结构体

结构体的定义

struct 结构类型名{
    变量类型 成员1;
    变量类型 成员2;
    变量类型 成员3;
    变量类型 成员4;
    ...
}
结构体的关键字是struct

结构体类型名说明的是结构体的类型,在定义结构体的时候类型名可以省略。

结构体中所有的成员都放在{}中,{}后必须写;

结构体中可以有多个成员,成员的类型可以相同也可以不同。结构体是构造类型的一种。

结构体成员的类型可以是

基本类型char,short,int,long,double,float

数组:char a[3],int b[5]

指针类型:char *,int *,double *,float *,void *

结构体类型:结构体中可以嵌套结构体

结构体中不能写函数,但可以是函数指针。

结构体类型定义变量的方法

struct 结构体类型名 变量;

struct 结构体类型名 *指针变量;

访问内部成员的方法

变量.成员

指针变量->成员

结构体的使用

定义变量方法1struct student{
char name[20];
int age;
char sex;
}stu1;
定义变量方法2struct student stu2;

结构变量的赋值

方法1:定义变量的同时赋值
struct student{
    char name[20];
    int age;
    char sex;
}stu1 = {"zhangsan",20,'m'};

struct student stu2 = {"lisi",22,'w'};
方法2:先定义后赋值
struct student{
    char name[20];
    int age;
    char sex;
}stu1;
struct student stu2;

strcpy(stu1.name,"zhangsan");
stu1.age = 20;
stu1.sex = 'm';
    
strcpy(stu2.name,"lisi");
stu2.age=22;
stu2.sex='w';

方法2:跳成员赋值
struct student{
    char name[20];
    int age;
    char sex;
}stu1 = {
    .name = "zhangsan",
    .sex = 'm',
};

struct student stu2 = {
    .age = 22,
    .sex = 'w'
};

结构体数组的定义

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

结构体数组的使用



struct student{
    char name[20];
    int age;
    char sex;
    
}stu[3] = {
        
    {"zhangsan",20,'m'},
    {"lisi",22,'w'},
    {"wangwu",21,'m'}
};

printf("stu[0]的姓名:%s\n",stu[0].name);
printf("stu[0]的年龄:%d\n",stu[0].age);
printf("stu[0]的性别:%c\n",stu[0].sex);


printf("stu[1]的姓名:%s\n",stu[1].name);
printf("stu[1]的年龄:%d\n",stu[1].age);
printf("stu[1]的性别:%c\n",stu[1].sex);


printf("stu[2]的姓名:%s\n",stu[2].name);
printf("stu[2]的年龄:%d\n",stu[2].age);
printf("stu[2]的性别:%c\n",stu[2].sex);

结构体指针的定义

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


struct student *p;

结构体指针的使用

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


struct student stu1 = {"zhangsan",20,'m'};
struct student stu2 = {"lisi",22,'w'};


p = &stu1;
printf("stu1的姓名:%s\n",p->name);
printf("stu1的年龄:%d\n",p->age);
printf("stu1的性别:%c\n",p->sex);

p = &stu2;
printf("stu2的姓名:%s\n",p->name);
printf("stu2的年龄:%d\n",p->age);
printf("stu2的性别:%c\n",p->sex);

结构体嵌套的定义

struct student{
    char name[20];
    int age;
    char sex;
    struct class{
        char name[20];
        int grade;
    }cls;
};

结构体和typedef结合的使用

typedef struct student{
    char name[20];
    int age;
    char sex;
    
} STU;
STU stu1 = {"zhangsan",20,'m'};
STU stu2 = {"lisi",22,'w'};

printf("stu1的姓名:%s\n",stu1.name);
printf("stu1的年龄:%d\n",stu1.age);
printf("stu1的性别:%c\n",stu1.sex);



printf("stu2的姓名:%s\n",stu2.name);
printf("stu2的年龄:%d\n",stu2.age);
printf("stu2的性别:%c\n",stu2.sex);

结构体内部指针的用法

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    int a;
    int *p; 
}aa_t;

int main(int argc, const char *argv[])
{
    aa_t *w; 

    w =(aa_t *)malloc(sizeof(aa_t)); //malloc申请了12字节内存
    if(w == NULL){
        printf("malloc error\n");     
        return -1; 
    }   

    w->a = 10; //对a赋值是成立的
    //*w->p = 20;//这样的赋值会出现段错误,w->p指针没有指向的内存
    w->p = malloc(4); //给p指针申请内存,否则它没有指向的内存
    *w->p = 20; 

    printf("a = %d,*p = %d\n",w->a,*w->p);

    return 0;
}

结构体内部结构体的用法

#include <stdio.h>
#include <stdlib.h>
typedef struct{
    int a;
    int *p; 
}aa_t;
typedef struct {
    int b;
    aa_t c[2]; 
    aa_t *q; 
}bb_t;

int main(int argc, const char *argv[])
{
    bb_t *w; 

    w = (bb_t *)malloc(sizeof(bb_t));
    
    w->b = 10; 

    w->c.a = 20; 
    w->c.p =(int *)malloc(4);
    *w->c.p = 30; 
    
    w->q = (aa_t *)malloc(sizeof(aa_t));
    w->q->a = 40; 
    w->q->p = (int *)malloc(4);
    *w->q->p = 50; 

    printf("%d,%d,%d,%d,%d\n",w->b,w->c.a,*w->c.p,w->q->a,*w->q->p);     
    return 0;
}

结构体的内存对齐

结构体在内存中是以字节为单位进行对齐的,结构体的对齐方式取决于编译器的实现。

对齐规则
x86(linux 默认#pragma pack(4),window 默认#pragma pack(8))。
linux 最大支持 4字节对齐。

方法:
①取 pack(n)的值(n= 1 2 4 8–),取结构体中类型最大值 m。两者取小即为外对齐大
小 Y= (m<n?m:n)。

②将每一个结构体的成员大小与 Y 比较取小者为 X,作为内对齐大小.

③所谓按 X 对齐,即为地址(设起始地址为 0)能被 X 整除的地方开始存放数据。

④外部对齐原则是依据 Y 的值(Y 的最小整数倍),进行补空操作。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MarkTop1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值