本文所结合图书及视频

《C语言程序设计(第四版)谭浩强.pdf》
《C语言入门到精通—鹏哥带你C语言入门到精通》
《郝斌老师的C语言自学视频》
这些在B站上都能找得到的。

学习目标:

 对C语言的结构体有个全面的了解,会使用简单的结构体。

章节内容:

   1.结构体类型的声明
   2. 结构体初始化
   3. 结构体成员访问
   4. 结构体传参

一 、结构体类型的声明

1、结构体基础知识
  结构是一些值的 [集合],这些值被称为成员变量。结构的每个成员可以是不同类型的变量。说到集合,我们之前学习过的数组也是一种相同类型元素的集合,但是结构体的值的类型可以是不同的。
  C语言结构体(Struct)从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由 int、char、float 等多种基本类型组成的。所以说结构体是一种复合类型。

2、结构体的声明
  在C语言中,可以使用结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为:

struct 结构体名字
{结构体所包含的成员变量
};

举例: 比如我们要定义一个有关学生的结构体,可以按照下面的方法写:

struct Stu
{char name[20];  // 名字char sex[5];   // 性别int age;        // 年龄char id[20]; //  学号
}s1,s2;   // s1和s2也是结构体变量,不过是全局变量
int main()
{struct Stu s; // 用struct Stu类型创建了一个s对象return 0;     //  s是局部变量//
}

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

二、结构体初始化

  和其他类型变量一样,对结构体变量也可以在定义时指定初始值。

struct Stu
{char name[15]; // 名字int age;         // 年龄
};
struct Stu s = {"zhangsan", 25}; //定义变量同时赋初值

  还有结构体嵌套初始化

struct point
{int x;int y;
};
struct Node
{int data;struct point p;           //成员变量也是结构体struct Node* next;       //结构体指针变量
}n1 = {10,{4, 5}, NULL};   //结构体嵌套初始化
struct Node 2 = {20, {5, 6}, NULL}; //结构体嵌套初始化

注意:
  当结构体成员变量中有结构体类型时,初始化时要将其单独用{ }括起来!

三、结构体成员的访问

  结构体成员访问有两个操作符,就是.-> 操作符,我们在操作符那章C语言 操作符详解二也讲过了,大家如果忘记了,也可以翻过去重新复习下!具体用法我们再举例说明下。

struct xiaoming
{char c;short s;double d;
};
struct Stu
{struct xiaoming;  char name[20];  //姓名char sex[5];   // 性别int age;       // 年龄char id[20]; //  学号
}s1,s2;   // s1和s2也是结构体变量,不过是全局变量
int main()
{struct Stu s = { {'w', 20, 5.2113}, "张三", 30, "D20220715"}; //假设我们要将 w 打印出来,我们可以这样写printf("%c\n", s.xiaoming.c); //因为 w 是在结构体 s 中成员变量结构体xiaoming的成员变量中,
// s为首层,xiaoming为第二层,所以要用两个点访问。//假设我们要将 “张三” 打印出来,我们可以这样写printf("%s\n", s.name); //因为 “张三” 是结构体 s 中的成员,一个点就可以访问到。return 0;     //  s是局部变量

  以上是.结构体成员访问操作符的用法,那么我们说还有->结构体成员访问操作符,它其实主要用在结构体指针变量中。

struct xiaoming
{char c;short s;double d;
};
struct Stu
{struct xiaoming;  char name[20];  //姓名char sex[5];   // 性别int age;       // 年龄char id[20]; //  学号
}s1,s2;   // s1和s2也是结构体变量,不过是全局变量
int main()
{struct Stu s = { {'w', 20, 5.2113}, "张三", 30,     "D20220715"}; struct Stu * pa = &s;  // pa指向的是一个结构体类型的类型//假设我们要将 w 打印出来,我们可以这样写printf("%c\n", (*pa).xiaoming.c); //pa指向s 将pa解引用等于s *pa = s printf("%c\n",pa->xiaoming.c);  //pa指向s 可直接用->访问到,但是xiaoming不是结构体指针,所以还是要写xiaoming.c//假设我们要将 “张三” 打印出来,我们可以这样写printf("%s\n", s.name);    //因为 “张三” 是结构体 s 中的成员,一个点就可以访问到。printf("%s\n", pa->name); // pa指向s 可直接用->访问。 return 0;    //  s是局部变量

   -> 操作符主要是用在结构体指针中,且在结构体指针中我们一般用->操作符,而很少使用解引用的操作。

四、结构体传参

  当结构体作为函数参数来使用时,有两种方法,一种是按值传递,一种是按址传递。结构体变量名代表的是整个集合本身,作为函数参数时传递的是整个集合,也就是所有成员。

struct xiaoming
{char c;short s;double d;
};
struct Stu
{struct xiaoming;  char name[20];  //姓名char sex[5];   // 性别int age;       // 年龄char id[20]; //  学号
};
void printf1(struct Stu t)
{printf("%c %d %lf %s %d %s\n", t.xiaoming.c,t.xiaoming.s,t.xiaoming.d,t.name,t.age,t.id);
}
void printf2(struct Stu *pa)
{printf("%c %d %lf %s %d %s\n", pa->xiaoming.c,pa->xiaoming.s,pa->xiaoming.d,pa->name,pa->age,pa->id);
}
int main()
{struct Stu s = { {'w', 20, 5.2113}, "张三", 30,     "D20220715"}; //用函数打印 s 的内容printf1(s); // 打印结果 w 20 5.211300 张三 30 D20220715printf2(s); // 打印结果 w 20 5.211300 张三 30 D20220715//虽然 printf1 和 printf2 打印的结果一样,但是更推荐用printf2这种方法,其所占空间更少,速度更快,效率更高!return 0;

  如果结构体成员较多,尤其是成员为数组时,传送的时间与空间开销都会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,会大大降低程序运行的空间与提高运行速度!
注意事项:
   按值调用:形参是实参的临时拷贝,空间等同,改变形参的值不会改变实参的值。
   按址调用:形参接受的只是实参的地址,空间很小,改变形参的值能改变实参的值,时间空间开销更小,效率更高!

  本节的内容就分享到这里了,关于更高级的结构体内容我会放在后期的章节来重点讲解,下期我们一起学习在编写程序时的一些调试技巧


C语言自学之路十四(详解C语言初阶结构体)相关推荐

  1. C语言自动类型转换和强制类型转换详解,C语言强制类型转换 - 地狱的烈火的个人页面 - OSCHINA - 中文开源技术交流社区...

    C语言中的类型转换 C语言中的类型转换有两种,自动与强制. 它们都有几种情况,如不同长度的转换:不同类型的转换:还有无符号与有符号数之间的转换.关键是两点,即长度不同时如何转换,在有无符号数参与时如何 ...

  2. c4.5算法 程序语言,决策树之C4.5算法详解-Go语言中文社区

    决策树之C4.5算法详解 主要内容 C4.5算法简介 分裂属性的选择--信息增益率 连续型属性的离散化处理 剪枝--PEP(Pessimistic Error Pruning)剪枝法 缺失属性值的处理 ...

  3. c语言如何判断字符json,全面详解C语言使用cJSON解析JSON字符

    为什么选择cJSON来解析JSON字符串?因为简洁又简单,而且效率又快,cJSON工程文件也非常简单,仅一个.c文件和一个.h文件! 如果要自己写的话就是重造轮子了,况且效率上也不一定会比cJSON更 ...

  4. c/c++中typedef详解(此文对typedef用于结构体的定义说明得很清楚到位)

    1. typedef 最简单使用 [c-sharp] view plain copy typedef long byte_4; // 给已知数据类型long起个新名字,叫byte_4 你可以在任何需要 ...

  5. 嵌入式Linux驱动笔记(十四)------详解clock时钟(CCF)框架及clk_get函数

    你好!这里是风筝的博客, 欢迎和我一起交流. 我在找资料的时候,发现网上大部分文章都是说: 在s3c244x_init_clocks函数里: void __init s3c244x_init_cloc ...

  6. c语言中函数作用于数组,详解C语言中的函数、数组与指针

    1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念: 函数 ...

  7. c语言指针常量和常量指针,详解C语言中的常量指针和指针常量

    概述对于新手来说,指针在c语言里总是一个非常难以理解的概念.在这篇文章中,我们将解释常量指针,指针常量,const pointer to const(ps:楼主以为这可以翻译成指向常量的常量指针)的区 ...

  8. c语言程序设计中 编写韩束,详解C语言函数

    函数的定义 函数的定义如下: 类型 函数名(形式参数) { 代码块 } 代码块包含了局部变量的声明和函数调用所要执行的语句. return语句 return 语句的语法如下: return expre ...

  9. c语言编程 输入螺旋数组,C语言 经典题目螺旋矩阵 实例详解

    C语言 经典题目螺旋矩阵 实例详解 C语言 经典题目螺旋矩阵 //N阶螺旋矩阵 #include #include int main() { int N,i,j,n,num=1; int a[10][ ...

  10. c语言二级指针有什么作用,C语言中二级指针的实例详解

    C语言中二级指针的实例详解 C语言中二级指针的实例详解 用图说明 示例代码: #include int main(int argc, const char * argv[]) { // int a = ...

最新文章

  1. [Z]谷歌(Google)算法面试题
  2. 成功解决pywintypes.com_error: (-2147352567, '发生意外。', (0, 'Kingsoft WPS', '文档保存失败。', '', 3011, -214746725
  3. 【Linux】一步一步学Linux——ypdomainname命令(173)
  4. 分布式ID-美团(Leaf)
  5. sphinx下的max_matches取值对SetLimits的影响
  6. 25 张图,一万字,拆解 Linux 网络包发送过程
  7. 屏幕录制专家linux版,录屏大师免费版下载-录屏大师全新下载V3.5.3-Linux公社
  8. python中的复数操作(实部、虚部、求模、求共轭)
  9. ios手机添加frida软件源
  10. 服务器winsxs文件夹怎么清理工具,winsxs,详细教您winsxs文件夹清理方法
  11. Python 随机漫步
  12. Axure8日期控件原型
  13. adb root 权限运行
  14. GO语言-数据结构-队列
  15. win10分屏快捷键无法使用_Win10分屏操作,再也不用来回切换视图了!
  16. 八位彻底改变App Store的iOS开发者
  17. 闭区间连续函数的性质+习题课(函数与极限总复习)——“高等数学”
  18. 模型auc指标_auc致命缺陷模型指标
  19. 前端开发知识库工具之网文快捕
  20. 四川电信创维E900V21E-高安版-线刷刷机固件

热门文章

  1. day55-负载均衡之lvs
  2. 迈达斯导出html计算书,动态计算书模块功能-midas Civil 2011
  3. Power BI Desktop 中的数据源
  4. 实用技巧:阿里云服务器建立公网物联网服务器(解决阿里云服务器端口,公网连接不上的问题)
  5. Netperf 网络性能测试
  6. 恒德可视化指挥调度解决方案
  7. 基于libmodbus库实现modbus TCP/RTU通信
  8. DirectX简单的FBX文件加载(网格MESH)
  9. 国产性能最稳定NFC读卡器芯片FSV9520完美替代CV520 SPI接口 可免费提供软硬件DEMO 快速研发产品
  10. Excel·VBA考勤打卡记录数据整理