C 语言结构体的使用方法

 更新时间:2021年9月3日 00:00  点击:1511

C 语言结构体使用

1. 结构体的声明和定义

1.1 介绍

  • 我们知道数组是同种类型值的集合,而结构就是可以将不同类型的值放在一起。
  • 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
  • 结构的成员可以是标量、数组、指针,甚至是其他结构体。

如我们可以将一个学生的一些属性放在一起

struct stu//定义一个结构体类型,就如int、char,struct stu是我们定义的结构体类型
{
    //成员变量
    char name[20];//名字
    int age;//岁数
    char id[20];//学号
};
int main()
{
    struct stu a;//定义一个struct stu类型的变量a,而对象a中就包含了名字,岁数,学号的属性
}

1.2定义的几种类型

类型1:

struct stu
{
    char name[20];
    int age;
};
int main()
{
    struct stu a;//定义局部变量a
}

类型2:

struct stu
{
    char name[20];
    int age;
}s1,s2;//定义全局变量s1,s2

2. 结构体初始化

代码如下:

struct book
{
   float height;
   char name[20];
}b;
struct stu
{
    char name[20];
    int age;
    char id[20];
    struct book b;
};
int main()
{
    //初始化时,其实是和数组初始化一样,用大括号,里面放上初始化的值。若结构体里面包含结构体,则大括号里面 //在放一个大括号,里面放内部结构体初始化的值
    
    struct stu a={"bobo",18,"2021520",{15.8,"free"}};
}

3. 结构体成员访问

3.1 成员介绍

  • 结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数,如:m.n(m为结构体变量,n为结构体中你想要访问的成员变量)
  • 指向一个结构体的指针访问指向变量的成员是通过操作符(->)访问的。 如:m->n(m为指向一个结构体的指针,n为结构体中你想要访问的成员变量),也可以(*m).n

struct book
{
   float height;
   char name[20];
}b;
struct stu
{
    char name[20];
    int age;
    char id[20];
    struct book b;
};
int main()
{
    struct stu a={"bobo",18,"2021520",{15.8,"free"}};
    //法一
    printf("%s\n",a.name);
    printf("%d\n",a.age);
    printf("%.1f\n",a.b.height);//若访问结构体中的结构体中的一个成员,先访问到内部的结构体,再访问内部结构体中的成员
    
    //法二
    struct stu* pa=&a;
    printf("%s\n",pa->name);
    printf("%d\n",pa->age);
    printf("%.1f\n",pa->b.height);
    
    //法三
    printf("%s\n",(*pa).name);
    printf("%d\n",(*pa).age);
    printf("%.1f\n",(*pa).b.height);
}

4. 结构体传参

注意:

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

代码如下:

struct book
{
   float height;
   char name[20];
}b;
struct stu
{
    char name[20];
    int age;
    char id[20];
    struct book b;
};
void print1(struct stu p)
{
    printf("%s %d %s %.1f %s",p.name,p.age,p.id,p.b.height,p.b.name);
}
void print2(struct stu* pa)
{
    printf("%s %d %s %.1f %s",pa->name,pa->age,pa->id,pa->b.height,pa->b.name);
}
int main()
{
    struct stu a={"bobo",18,"2021520",{15.8,"free"}};
    
    //写一个函数打印a的内容
    
    print1(a);//结果为:bobo 18 2021520 15.8 free(正常打印)
    
    //再写一个函数,通过传a的地址打印a的内容
    
    print2(&a);//结果为:bobo 18 2021520 15.8 free(正常打印)
    
    return 0;
}

那么传值和传址有什么不同,哪个更好呢?(首选传址

  • 传参时,其实是对实参的一份拷贝,是会开辟一块空间来存储实参。传值,是将整个实参拷贝过去,而传地址,传过去的只是地址,传参的效率更高一些。
  • 函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

那么什么是函数调用的参数压栈呢?

栈:一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表

特点:先进的后出,后进的先出。(先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来))

压栈:给栈里存数据

  • 每一个函数的调用都会在内存的栈区上开辟一块空间,并且数据都会如压栈一样一个一个的存放进栈区,如果数据比较多、大时,参数压栈就比较吃力,所以导致性能就会下降。

到此这篇关于C 语言结构体的使用基础版的文章就介绍到这了,更多相关C 语言结构体的使用内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • C语言实现放烟花的程序

    这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
  • C语言中的字符(char)详细讲解

    本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
  • 详解如何将c语言文件打包成exe可执行程序

    这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • C语言中计算正弦的相关函数总结

    这篇文章主要介绍了C语言中计算正弦的相关函数总结,包括正弦和双曲线正弦以及反正弦的函数,需要的朋友可以参考下...2020-04-25
  • 详解C语言中的rename()函数和remove()函数的使用方法

    这篇文章主要介绍了详解C语言中的rename()函数和remove()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
  • C语言中求和、计算平均值、方差和标准差的实例

    这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
  • 浅析C# 结构体struct

    这篇文章主要介绍了C# 结构体struct 的相关资料,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...2020-11-03
  • C语言的基本语法详解

    本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...2021-09-18
  • C语言中send()函数和sendto()函数的使用方法

    这篇文章主要介绍了C语言中send()函数和sendto()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
  • C语言实现从文件读入一个3*3数组,并计算每行的平均值

    今天小编就为大家分享一篇C语言实现从文件读入一个3*3数组,并计算每行的平均值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
  • 关于C#结构体 你需要知道的

    这篇文章主要介绍了关于C#结构体的相关知识,以及使用方法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C语言中memcpy 函数的用法详解

    这篇文章主要介绍了C语言中memcpy 函数的用法详解的相关资料,需要的朋友可以参考下...2020-04-25
  • 使用C语言操作文件的基本函数整理

    这篇文章主要介绍了使用C语言操作文件的基本函数整理,包括创建和打开以及关闭文件的操作方法,需要的朋友可以参考下...2020-04-25
  • 基于C#调用c++Dll结构体数组指针的问题详解

    下面小编就为大家分享一篇基于C#调用c++Dll结构体数组指针的问题详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-25
  • C语言中查找字符在字符串中出现的位置的方法

    这篇文章主要介绍了C语言中查找字符在字符串中出现的位置的方法,分别是strchr()函数和strrchr()函数的使用,需要的朋友可以参考下...2020-04-25
  • C语言菜鸟基础教程之a++与++a

    很多同学在学习c语言的时候是不是会碰到a++和++a都有甚么作用啊。今天我们就来探讨下...2020-04-25
  • 快速了解c# 结构体

    这篇文章主要介绍了c# 结构体的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-11-03
  • 详解C语言中const关键字的用法

    这篇文章主要对C语言中const关键字的用法进行了详细的分析介绍,需要的朋友可以参考下...2020-04-25
  • C语言实现时间戳转日期的算法(推荐)

    下面小编就为大家带来一篇C语言实现时间戳转日期的算法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25