前言

C语言中的结构体作为一大难点,并且对于需要学习数据结构的同学来说,这个结构是每次上课都会遇到的,所以,我们只有更深层次的理解结构体的知识,才能更好的掌握数据结构

结构体用处

结构体到底有什么用?

比如,在STM32的RTC开发中,我们需要数据来表示日期和时间,这些数据通常是年、月、日、时、分、秒。如果我们不用结构体,那么就需要定义6个变量来表示。这样的话程序的数据结构是松散的,我们的数据结构最好是“高内聚,低耦合”的。所以,用一个结构体来表示更好,无论是从程序的可读性还是可移植性还是可维护性皆是:

这个时候,我们就可以定义一个结构体来解决这个问题

定义

struct 结构体名{

结构体所包含的变量或数组

};

或者

struct 结构体名{

结构体所包含的变量或数组

}结构别名;

这两种定义是相等的,区别就在于一个多了一个结构别名

我们还可以使用

typedef struct 结构体名{

结构体所包含的变量或数组

}结构别名;来定义,他们之间的区别,主要在于定义结构变量的书写

如定义一个结构变量 date

使用struct结构定义

struct structname date;

使用typedef struct定义

结构别名 date

使用这种方法我们可以不用写多余的struct,只需写结构别名 date就行,这种方式方便了很多

结构体成员

我们定义了结构体后,我们就可以为其定义成员变量

定义结构体成员变量的方法和定义变量没有什么区别

数据类型 名字

我们为上面的结构体A定义成员变量

调用

关于C语言结构体调用其成员的方法,可以用Java中类的方式来理解,这样会更加的形象

C语言调用成员方法 = 结构别名.a,结构别名.b,结构别名.c

下面写一个C程序调用实例

这是一个简单的用户输入图书信息,最后调用的过程

#pragma warning(disable:4996)

//#define _CRT_SECURE_NO_WARNINGS

和(void)如果你使用vs编译器,需要加上这两个才不会报错,其他编译器我不确定,没怎么使用

结构体嵌套使用

结构体的嵌套使用和函数一样,在一个结构体中使用另外一个结构体,他们之间并没有多大的区别

用一段代码来简单理解

解释:这里定义了两个两个结构体

Date和Book,从里面的代码可以看到

我们在book结构体中调用了Date,这个时候,就可以通过book访问Date结构体重的成员变量了

struct Date dd中dd的意思就是通过结构体struct Date定义一个变量

调用

printf("发售时间: %d-%d-%d\n",book.dd.year, book.dd.moon, book.dd.day);因为他们是嵌套的关系,所以就可以使用一个调用一个的方式进行调用

初始化结构体

先来定义一个结构体

方法一:

struct autonlist *nlists = 0;

直接进行赋值操作

symbol,symbol,nl[0],nl[1],left,left,*right,right会初始化成什么?

先搞清这句话的意思:

struct autonlist *nlists = 0;

等价于:struct autonlist *nlists = NULL;

这句话定义了一个autonlist结构的指针nlists,然后初始化指针为NULL,以防止被后面的语句误用(主要就是防止未对该指针赋值造成的内存错误,野指针操作);

既然这只是对指针的初始化,还使这个指针指向相应的结构变量,当然就不存在对结构的成员进行初始化的操作。

//symbol,nl[0],nl[1],left,*right //这些要自己去显示的初始化,系统默认的都是危险的,一般在用到结构体时要自己去初始化他们

方法二:

初始化结构体指定某一成员可以使用逗号(.) 运算符

比如只初始化autonlist的price成员

struct autonlist tesk = {.price = 34};

我们还可以不按结构体的顺序进行初始化

struct autonlist tesk = {.date = 'chu',

price = 23};

注意:当对多个成员进行初始化时,需要注意格式,其实就是JavaScript对象的书写格式

{

成员一 ,

成员二,

成员三,

成员四

}

最后一个不需要使用逗号

结构体指针

什么是结构体指针?

指向结构体的指针就叫做结构体指针

定义指针

struct Book *po;po = &book;

定义一个指针,使其指向book这个结构体

注意:这里的指针和数组不同,数组是默认地址就是其[0]号位,二结构体不同,所以需要用到“&”运算符

通过结构体指针访问结构体成员有两种方法

1. (*结构体指针).成员名

2. 结构体指针->成员名

问题: 这里的1、为何访问成员需要加括号()?

这是因为运算符等级的关系

逗号(.)运算符等级高于*号运算符

全部代码

c语言中定义结构体指针的作用,C语言结构体定义,使用及指针(1)相关推荐

  1. C语言中文件读写方式r 的作用,C语言文件读写操作主要函数及其用例

    C语言把磁盘文件看成是字符(或字节)的序列,按照存储信息的形式来说,文件主要是有文本文件和二进制文件.文本文件由一个个字符组成,每个字节存放一个ASCII码制,代表一个字符.二进制文件把内存中的数据按 ...

  2. c语言中的单词的意思及作用,C语言实现单词助手功能

    本文实例为大家分享了C语言实现单词小助手的具体代码,供大家参考,具体内容如下 单词小助手 (声明:此程序非原创,是在已有程序上进行一些修改和添加) 一.题目分析 题目要求: 1.改写程序为良好程序风格 ...

  3. c语言中赋值的时候顿号的作用,C语言运算符及其优先级汇总表口诀

    在看一些字符串问题的时候,经常出现这样的语句, *tmp++ = *p;比如tmp和p是指向数组元素的指针,那么这个语句的执行顺序是怎样的呢?正确的理解是*tmp,将*p赋给*tmp后tmp++.但是 ...

  4. c语言中数组结尾的0的作用,C语言里面一个数组最后的\0表示什么意思?

    qq_莫非 #include #include #include #include #include #include #include #include #include #define PORT  ...

  5. c语言中不能编译,为什么`int;`可以在C语言中很好地编译,而在C ++中却不能?

    考虑以下程序(请参见此处的现场演示). #include int main(void) { int ;  // Missing variable name puts("Surprise&qu ...

  6. c语言中各个符号的意义及作用是什么,C语言特殊符号意义

    初学者可以来学学,包教包会 C语言中像%D &%f符号的作用说一下 最佳答案 C语言中的符号 运算符的种类C语言的运算符可分为以下几类: 1.算术运算符 用于各类数值运算.包括加(+).减(- ...

  7. c语言中函数名可不可以由用户命名,C语言中变量名及函数名的命名规则与驼峰命名法...

    在程序设计中,变量名.函数名.数组名等统称为标识 符.简单地说,标识符就是一个名字.除库函数的函数名由系统定义外,其余都由用户自定义.C语言规定,标识符只能由字母(a-z,A-Z).数字 (0-9). ...

  8. c语言运算符类型转换,C语言中强制类型转换运算符的独特作用

    C语言中强制类型转换运算符的独特作用 在C语言中有一个强制类型转换运算符,它为C语言中的数据类型转换带来 (本文共2页) 阅读全文>> 在进行C++类的设计时,我们常常需要为类对象设计运算 ...

  9. 常见位操作及运算应用举例:1,C语言中位运算符异或“∧”的作用​​​​​​​2,异或运算的作用3,(与运算)、|(或运算)、^(异或运算)

    1 C语言中位运算符异或"∧"的作用: 异或运算符∧也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即0∧0=0,0∧1=1,1∧1=0 ...

  10. C语言中双下划线__的作用

    C语言中双下划线__的作用 以单下划线(_)表明是标准库的变量 双下划线(__) 开头表明是编译器的变量 所以 双下划线__只是C语言的一个合法标识符 不一定是变量, 也可以是函数,宏等. 同时双下划 ...

最新文章

  1. 根据一个大图片自动生成相应小图片的代码
  2. 【转】c++重载、覆盖、隐藏——理不清的区别
  3. 详解Struts2 Action名称的搜索顺序
  4. 好的重构方法才能摆脱“屎山”
  5. oracle idl_ub1$,system表空间急剧增大原因分析
  6. java名片_javaweb名片管理系统
  7. 解决Junit问题的方法
  8. 详细讲解怎样做数据仓库需求分析
  9. idea64.exe.vmoptions 参数意义
  10. Java 生产环境 linux下汉字变方框解决
  11. dell无法启动计算机,戴尔电脑装系统蓝屏无法启动怎么办
  12. Linux+v4l2自动设置相机曝光时间
  13. Animation之闪烁的星星
  14. 页错误异常处理(page fault)的实现
  15. cpython cython_Cython笔记
  16. 计算机网络daytime实现之java/python/c++版本
  17. 【阿里巴巴百川掌中测 限量内测招募啦】来自阿里的移动开发测试洪荒之力
  18. Java实例类中的切面_Spring进行面向切面编程的一个简单例子
  19. eclipse不进入断点_eclipse断点不起作用怎么办?
  20. 【阶段总结】研二上学期总结

热门文章

  1. mondrian的个人总结
  2. CNN 可视化卷积核
  3. ASRT golang SDK demo (golang 语言识别客户端demo)
  4. Ubuntu 16.04安装RealSense ROS功能包
  5. iView UI --Table组件数据刷新但是页面未刷新
  6. 超融合市场的战争远未结束,谁将最终胜出?
  7. 计算机如何锁定桌面壁纸,误操作怎么办?壁纸锁定的4种方法来了
  8. ISO_IEC_7816-3
  9. HarmonyOS JS UI
  10. html5 矢量图形插件,HTML5画布矢量图形?