栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言基础16 初阶结构体

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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%lfn",s.name,s.age,s.score); //结构体变量.成员变量
 
   //方法二:
   //指针变量
   struct Stu * ps =&s;
   printf("%s%d%lfn",(*ps).name,(*ps).age,(*ps).score);//使用指针变量

   //方法三:
   //结构体指针->成员变量名
   printf("%s%d%lfn",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("%cn",s.s2.c); //. 操作符
    printf("%sn",s.id);
    
    struct Stu* ps = &s;
    printf("%cn",(*ps).s2.c); //* 操作符
    printf("%cn",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 % sn", 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 % sn", 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函数,是因为:

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917169.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号