C笔记 结构体

结构体是一种构造数据类型
把不同的数据类型整合起来 称为一个自定义的数据类型

1 结构体初始化
定义结构体Man

struct Man{
    char name[20];
    int age;
};
void main(){
    //初始化结构体的变量  只能在声明变量是赋值
    struct Man man = { "赵信", 21 };
    printf("%s,%d\n",man.name,man.age);

    getchar();
}

打印结果:

赵信,21

在打印之前修改名字

strcpy(man.name, "德玛");

或者是

sprintf(man.name,"皇子");

打印结果为

德玛,21
皇子,21

2 结构体的几种写法

struct Man{
    char name[20];
    int age;
} m1, m2 = { "张辽", 30 };

typedef int age;

void main(){
    strcpy(m1.name, "高飞");
    m1.age = 20;
    printf("%s,%d\n", m1.name, m1.age);
    printf("%s,%d\n", m2.name, m2.age);

    getchar();
}

打印结果

高飞,20
张辽,30

匿名结构体

struct{
    char name;
    int age;
} s1;

结构体嵌套

struct Teacher{
    char name[20];
};

struct Student{
    int age;
    struct Teacher t;
};

或者是

struct Student{
    char name[20];
    int age;
    struct Teacher{
        char name[20];
    } t;
};
void main(){
    struct Student student = { 21, {"亚索"} };
    printf("%d,%s\n",student.age,student.teacher.name);

    getchar();
}

打印结果

21,亚索

3 结构体与指针数组

struct Man{
    char name[20];
    int age;
};

void main(){
    struct Man mans[] = { { "Kobe", 38 }, { "Gready", 37 } };
    struct Man *p = mans;

    //遍历方式 1
    /*for (; p < mans+2;p++){
        printf("%#x\n",p);
        printf("%s,%d\n",p->name,p->age);
    }*/

    //遍历方式 2
    int i = 0;
    for (; i < sizeof(mans) / sizeof(struct Man); i++){
        printf("%#x\n", mans[i]);
        printf("%s,%d\n", mans[i].name, mans[i].age);
    }

    system("pause");

}

打印结果

0x97fbd8
Kobe,38
0x97fbf0
Gready,37

这里写图片描述

3 结构体大小
(字节对齐)

struct Man{
    int age;
    double weight;
};

void main(){
    struct Man m = {20,50.6};
    printf("%#x,%d",&m,sizeof(m));
    getchar();
}

打印结果

0xfaf79c,16

结构体中,int占4个字节,double占8个字节。所以m应该占12个字节才对。但是实际上m占16个字节。 这是因为结构体变量的大小,必须是最宽基本数据类型的整数倍。这样做会提升读取的效率。

4 结构体动态内存分配

struct Man{
    int age;
    char *name;
};

void main(){
    struct  Man* man = (struct Man*)malloc(sizeof(struct Man) * 10);
    struct Man *p = man;

    //赋值
    p->name = "Davis";
    p->age = 23;

    p++;
    p->name = "Rose";
    p->age = 25;

    struct Man *loop = man;

    for (; loop < man + 2; loop++){
        printf("%s,%d\n", loop->name, loop->age);
    }

    free(man);
    getchar();
}

5 typedef结构体取别名

typedef int* Ap;

typedef struct Women* Wp; //Women结构体指针的别名
typedef struct Women W; //Women结构体的别名

typedef struct Women{
    char name[20];
    int age;
};


void main(){
    int i = 5;
    Ap  p = &i;

    //结构体变量
    W  w1 = { "Rose", 25 };

    //结构体指针
    Wp wp1 = &w1;
    printf("%s,%d\n", w1.name, w1.age);
    printf("%s,%d\n", wp1->name, wp1->age);

    getchar();
}

打印结果

Rose,25
Rose,25

1 不同名称代表不同的操作
2 不同情况使用不同的别名
3 书写简洁

6 结构体函数指针

struct Girl{
    char *name;
    int age;
    //函数指针
    void(*sayHi)(char*);
};

//Girl结构体类似于Java中的类,name和age类似于属性,sayHi类似于方法

void sayHi(char*text){
    MessageBox(0, text, "title", 0);
}

void main(){
    struct Girl g1;
    g1.name = "Lucy";
    g1.age = 17;
    g1.sayHi = sayHi;

    g1.sayHi("hello");
    getchar();
}

运行后 弹窗
下面是使用取别名的方式

typedef struct Girl{
    char *name;
    int age;
    //函数指针
    void(*sayHi)(char*);
}Girl;

//Girl结构体指针取别名GirlP
typedef Girl* GirlP;

void sayHi(char* text){
    MessageBoxA(0, text, "title", 0);
}

//改名
void rename(GirlP gp1){
    gp1->name = "Lily";
}

void main(){
    Girl g1 = { "Lucy", 18, sayHi };
    GirlP gp1 = &g1;
    gp1->sayHi("Byebye!");
    //传递指针,改名
    rename(gp1);

    getchar();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值