C语言基础16 初阶结构体

结构体

结构体是什么?

结构体可以让C语言创建新的类型

例如:

创建学生类型

struct Stu
{
    char name[20];
    int age;
    double score;
};

创建书类型

struct Book
{
     char name[20];  //成员变量
     float price;
     char id[30];
};

使用数类型与学生类型

int main()
{
   //方法一:
   //结构体变量.成员变量
   struct Stu s ={"张三",20,90};  //结构体的创建和初始化
   printf("%s%d%lf\n",s.name,s.age,s.score); //结构体变量.成员变量
 
   //方法二:
   //指针变量
   struct Stu * ps =&s;
   printf("%s%d%lf\n",(*ps).name,(*ps).age,(*ps).score);//使用指针变量

   //方法三:
   //结构体指针->成员变量名
   printf("%s%d%lf\n",ps->name,ps->age,ps->score);

   return 0;
}

Console:
张三 20 85.500000
张三 20 85.500000
张三 20 85.500000

结构体的声明

数组:
一组想同类型的元素的集合

结构体:
也是一些值的集合,但是值的类型可以不同。

结构的声明

结构体关键字  结构体名字
   |        / 
struct Stu
{
    //成员变量
    char name[20]; 
    itn age;     
};

全局结构体变量

struct Stu
{
    //成员变量
    int s;
}s1,s2; //s1和s2也是结构体变量

s1和s2也是结构体变量,但和里面的s不同的是,s1和s2是全局变量。

结构成员的类型

结构的成员可以是标量、 数组、 指针,甚至是其他结构体

结构体变量的定义和初始化

结构体变量初始化

struct Stu
{
   struct B s2;
   char name[20];
   int age;
   char id[20];
}

int main()
{
    struct Stu s ={ { 'c', 20, 3.1},"张三"20,5998};
    return 0;
}

{‘w’,20,3.1}是s2 的初始化。

"张三"是name的初始化。

30是age的初始化。

5998是id的初始化。

结构体操作符:

        .       ->

借助上面的例子,使用结构体操作符:

struct B
{
   char c;
   short s;
   double d;
}

struct Stu
{
   struct B s2;
   char name[20];
   int age;
   char id[20];
}

int main()
{
    struct Stu s ={ { 'c', 20, 3.1},"张三"20,5998};
    printf("%c\n",s.s2.c); //. 操作符
    printf("%s\n",s.id);
    
    struct Stu* ps = &s;
    printf("%c\n",(*ps).s2.c); //* 操作符
    printf("%c\n",ps->s2.c);//->操作符
    
    return 0;
}

Console:
c
5998
c
c

结构体传参

struct B
{
   char c;
   short s;
   double d;
}

struct Stu
{
   struct B s2;
   char name[20];
   int age;
   char id[20];
}

//
void printl(struct Stu t)
{
     printf("%c %d %lf %s %d % s\n", t.s2.c, t.s2.s, t.s2.d, t.name, t.age, t.id);
}

void printl2(struct Stu* ps)
{
     printf("%c %d %lf %s %d % s\n", ps->s2.c, ps->s2.s,, ps->s2.d,, ps->name, ps->age, ps->id);
}

int main()
{
    struct Stu s ={ { 'c', 20, 3.1},"张三"20,5998};
    //写一个函数打印s的内容
    printl(s); //传值调用
    printl2(&s); //传址调用
    
    return 0;
}

Console:
c 20 3.100000 张三 20 5998

相比于printl与printl2,哪个函数更好一些?

应该首选printl2函数,是因为:

函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以会导致性能的下降。

结论:结构体传参的时候,要传结构体的地址,效果更好

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值