C语言结构体类型

1. 基本数据类型

在这里插入图片描述
https://blog.youkuaiyun.com/weixin_44002591/article/details/137409618?spm=1001.2014.3001.5501

2.结构体类型

当我们想定义一个人、书籍等复杂对象时,上述数据类型显然不能满足我们的需求。
人:名字、年龄、性别、地址、电话;
书籍:书名、作者、定价、书号、出版社;

C语言提供了一种可用于自定义的类型,结构体类型,struct。
结构体就是把一些单一的类型组合在一起的类型。

#include <stdio.h>
// 学生
typedef struct Stu
{
    // 结构体成员
    char name[20];
    int age;
    char sex[10];
    char tel[12];
} Stu; // 将struct Stu 类型 的简洁别名为 Stu,后续可直接用 Stu 进行结构体声明

2.1 结构体成员访问方式一:

结构体成员访问操作符:结构体对象.成员名

int main()
{
    Stu s = {"zhangsan", 20, "nan", "123456789"};
    printf("%s %d %s %s", s.name, s.age, s.sex, s.tel);  // 结构体成员的访问方法:结构体对象.成员名
    return 0;
}

2.2 结构体成员访问方式二:

创建结构体对象指针,解引用之后进行访问

void print(Stu *p)
{
    printf("%s %d %s %s\n", (*p).name, (*p).age, (*p).sex, (*p).tel);
}

int main()
{
    Stu s = {"zhangsan", 20, "nan", "123456789"};
    print(&s);
    return 0;
}

2.3 结构体成员访问方式三:

创建结构体对象指针,利用指针指向结构体成员的访问操作符:结构体对象指针->成员名

void print(Stu *p)
{
    printf("%s %d %s %s\n", p->name, p->age, p->sex, p->tel);
}

int main()
{
    Stu s = {"zhangsan", 20, "nan", "123456789"};
    print(&s);
    return 0;
}

3 结构体传参

函数传参分为值传递和址传递;

struct S
{
int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s); //传结构体
print2(&s); //传地址
return 0;
}

上面的print1 和print2 函数哪个好些?
答案是:首选print2函数。
原因:

函数传参的时候,参数是需要压栈的。也就是采用值传递(直接传递结构体)时,程序会向内存申请新的内存空间,将已有结构体的值传递到新的内存空间中,导致内存占用过大。
所以,如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

结论:

结构体传参的时候,要传结构体的地址。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值