结构体(2)

指向结构体数组的指针

struct student t[3] = {{0, "zhang", 20}, {1, "li", 20}, {0, "张三", 20}};

结构中的数组成员和指针成员

一个结构中可以有数组成员,也可以有指针成员,如果是指针成员结构体成员在初始化和赋值的时候就需要提前为指针成员分配内存

struct man
{
    char name[100];
    int age;
};

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

在堆中创建的结构体

如果结构体有指针类型成员,同时结构体在堆中创建,那么释放堆中的结构体之前需要提前释放结构体中的指针成员指向的内存。

struct man
{
    char *name;
    int age;
};
    struct man *s = malloc(sizeof(struct man) * 2);
    s[0].name = malloc(10 * sizeof(char));
    s[1].name = malloc(10 * sizeof(char));

这里写图片描述

将结构作为函数参数

将结构作为函数参数

将结构指针作为函数参数

这里写图片描述

这里写图片描述

结构,还是指向结构的指针

在定义一个和结构有关的函数,到底是使用结构,还是结构的指针?
指针作为参数,只需要传递一个地址,所以代码效率高
如果一个结构体变量做为函数的参数,效率极低。同时老的C编译器都不支持传递结构变量,只支持传递结构指针。

这里写图片描述

远指针与近指针

这里写图片描述

返回值区别:返回结构体变量和数组变量

这里写图片描述

这里写图片描述

代码示例

struct student {
    int id;
    char name[100];
    int age;
}

struct man {
    int id;
    char *name;
    int age;
}

int main()
{
    struct student t1 = {0, "张三", 20};
    struct student *p = &t1;
    printf("s1 name = %s\n", p->name); // 张三


    struct student t[3] = {{0, "zhang", 20}, {1, "li", 20}, {0, "张三", 20}};
    struct student *p = t1;
    printf("s1 name = %s\n", p.name); // zhang

    for (int i = 0; i < 3; i++) {
        printf("s%d name %s\n", i, p[i].name);
    }


    // 结构体在堆中.
    struct man *m = malloc(sizeof(struct man));
    m->id = 1;
    m->age = 20;
    // 结构体的元素也在堆中.
    m->name = malloc(10);
    strcpy(m->name, "hello");
    printf("id=%d age=%d name=%s\n", m->id, m->age, m->name);

    free(m->name);
    free(m);


    // 结构体数组.
    struct man *m = malloc(sizeof(struct man) * 10);
    for (int i = 0; i < 10; i++) {
        m[i].id = i;
        m[i].age = i;
        m[i].name = malloc(10);
        sprintf(m[i].name, "%d", i);
    }

    // 打印.
    for (int i = 0; i < 10; i++) {
        printf("id = %d, age = %d, name = %s\n", m[i].id, m[i].age, m[i].name);
    }

    // 销毁.
    for (int i = 0; i < 10; i++) {
        free(m[i].name);
    }
    free(m);

    struct man m1 = {0, "zhang", 20};
    func1(m1);
    printf("id = %d, name = %s\n", m1.id, m1.name); // id = 0, name = li

    func2(&m1);
    printf("id = %d, name = %s\n", m1.id, m1.name); // id = 2, name = li

    return 0;
}

void func1 (struct man m)
{
    printf("id = %d, age = %d, name = %s\n", m.id, m.age, m.name);
    strcpy(m.name, "li");
    m.id = 2;
}

void func2 (struct man *m)
{
    printf("id = %d, age = %d, name = %s\n", m.id, m.age, m.name);
    strcpy(m.name, "li");
    m.id = 2;
}

// 函数返回结构体
struct man func3()
{
    struct man *m = malloc(sizeof(struct man));
    m->id = 1;
    m->age = 20;
    strcpy(m->name, "hello");

    return m;
}

// 返回值无效
char *func4()
{
    char buf[100] = {"hello"};

    return buf
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值