一、结构

1、C提供了两种类型的聚合数据类型---数组、结构。数组是相同类型的元素集合,它的每个元素长度相同,故可以通过下标引用或指针间接访问来选择的;而结构可以把不同类型的值存储在一起,由于结构的成员长度可能不相同,故不能用下标访问,每个结构体都有自己的名字,故可以通过名字访问结构体成员。

数组名是一个指针常量,因为它是指针标量故不能作为左值;当做右值使用时,它的值表示指向数组的第一个元素的指针。结构名是一个标量,当左值时表示存储的内存位置;当右值时,他表示的是存储在结构中值。

2、结构体几种声明形式:

函数原型:

struct tag {member_list} variable_list;

  • 先定义结构体类型,再定义结构体变量。

  struct Sample{

      int a;

      char b;

      float c;  

  };

  struct Sample x,y[20],*z;      //此时x,y[20],*z为Sample的结构体变量

  • 定义结构体类型的同时定义结构体变量。

    struct Sample{

          int a;

          char b;

          float c;  

      }x,y[20];

  此时还可以继续定义student结构体变量,如:

  struct Sample *z;

  • 不指定类型名而直接定义结构体变量

  struct {

     int a;

     char b;

     float c;  

  }x,y[20];

  这种方法没有定义结构类型名,而直接定义结构体变量x,y[20]之后,就不能再继续定义该类型的变量。

  • 用typedef定义结构体变量

    typedef struct {

      int a;

      char b;

      float c;  

  }Sample;

上面的代码,定义了一个结构体变量类型名。定义结构体变量方法如下:

Simple x;

Simple y[20],*z;

3、结构的初始化:

  struct Sample{

      int a;

      char b;

      float c;  

  }x={3,“hello“,1.1314};

4、结构成员访问

以下面结构体为例:

struct COMPLEX {

          float f;

          int a[20];

          long *lp;

          struct SIMPLE s;

          struct SIMPLE sa[10];

          struct SIMPLE *sp;

        }comp;

  • 直接访问:通过点操作符直接访问(.)。点操作符接受两个操作数,左边操作数就是结构体变量的名字,右边是需要访问的成员名字。如:comp.a、(comp.s).a、(comp.sa)[4]
  • 间接访问:如果你拥有一个指向结构的指针。如:

  void func (struct COMPLEX *cp);

  首先对指针执行间接访问操作,然后在使用点操作符来访问他的成员。点操作符的优先级高于间接访问操作符,故在表达式中必须应用()。如:(*cp).f。

  或者利用‘->’操作符来完成此项工作,如:cp -> f。

联合

  1、联合的声明和结构类似,但他的行为方式却和结构不同。联合的所有成员引用的是内存中的相同位置,可以在不同时刻把不同的东西存储在同一位置。

  函数原型:

  union tag {member_list} variable_list;

  如:

  union {

     float f;

     int i;

  }fi;

  2、联合的初始化:

  联合变量可以被初始化,但这个初始值必须是联合的第一个成员的类型,而且他必须位于一对花括号里面。如:

  union{

     int a;

     float b;

     char c[4];

  } x={5};

把x.a初始化为5。我们不能把它初始化为一个浮点或字符值,因为就算你赋值为其他值也会转化为一个整型值赋值给x.a。

 

C和指针---结构和联合的更多相关文章

  1. 【AT91SAM3S】SAM3S-EK Demo工程中,LCD驱动程序的加载(函数指针结构体)

    为了调试LCD,在英倍特的板子上烧Atmel的sam3s-ek_demo_1.4_source示例代码.LCD显示正常了,却找不到LCD的驱动究竟在哪. 花了好久,追踪到了这个执行过程. 进入main ...

  2. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  3. C语言的结构和联合,以及PHP是怎么实现弱类型的

    C语言的结构(struct):包含多个成员,可能有多种数据类型,并且需要分配几种类型占用空间之和的空间. 联合(union):支持多种类型,供使用者使用其中一种数据类型,当然是需要分配其中占用空间最大 ...

  4. 【转】结构struct 联合Union和枚举Enum的细节讨论

    结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...

  5. Go-常识补充-切片-map(类似字典)-字符串-指针-结构体

    目录 Go 常识补充 Go 命名 打印变量类型科普 _ 关键字 命名规范相关 包目录规范 切片 多维切片 切片初始化的方法 多维切片初始化 切片删除元素(会略微影响效率 ,少用) copy 函数 打散 ...

  6. C和指针 第十章 结构和联合 (二)

    结构体传值: 结构体也是标量,像字符和整数一样,可以传递给一个函数,但是传入整个结构体效率很低,可以传入指向结构体的指针来提高效率.如果不希望程序对结构体变量改变可以加入const关键词. typed ...

  7. 《C和指针》 读书笔记 -- 第10章 结构和联合

    1.聚合数据类型能够同时存储超过一个的单独数据,c提供了两种类型的聚合数据类型,数组和结构. 2.[1] struct SIMPLE { int a; }; struct SIMPLE x; [2] ...

  8. C的指针疑惑:C和指针10(结构和联合)

    结构也可以作为传递给函数的参数,它们也可以作为返回值从函数返回,相同类型的结构体变量相互之间可以赋值. 申明结构时使用另一种良好技巧是用typedef创建一种新的类型. typedef struct{ ...

  9. C和指针 第十章 结构和联合 习题

    1. 记账信息结构联合 typedef struct { unsigned int areaNum; unsigned int transNum; unsigned int station; } ph ...

随机推荐

  1. Spark集群和任务执行

    [前言:承接<Spark通识>篇] Spark集群组件 Spark是典型的Master/Slave架构,集群主要包括以下4个组件: Driver:Spark框架中的驱动器,运行用户编写Ap ...

  2. dhcp、tftp、httpd、pxe安装CentOS6.9

    虚拟机网络设置 要xshell连接虚拟机注意设置VMware Network Adapter VMnet2在同一网段 1.利用光盘配置本地yum源 [root@ZYB ~]# mount -r /de ...

  3. 常用的Linux命令,日常收集记录

    1.# yum install -y xxxx 解释:install代表往系统中安装一个或者多个软件包:-y 代表回答全部问题为是 2.# ps -ef | grep yum   (根据进程名来查看进 ...

  4. Python调用飞书发送消息

    一.创建飞书机器人 自定义飞书机器人操作步骤,具体详见飞书官方文档:<机器人 | 如何在群聊中使用机器人?>

  5. ps怎么抠图并和另一张图片合并?

    1.首先打开PS.然后随便选取两张图片.比如下图我想把那个小花朵扣出来移动到另外一张图片上. 2.用套锁工具把那个小花朵扣出来.如图我标出了套锁工具的图标.以及扣出来的小花朵.这里也可以选择" ...

  6. java小工具,使用Swing展示左树右表结构

    代码直接上: 入口类 import java.io.File; import java.util.ArrayList; import java.util.List; import org.json.J ...

  7. 两种图片下拉放大效果实现(自定义CoordinatorLayout以及自定义Recylerview)

    一.自定义CoordinatorLayout实现图片放大功能 本文是基于折叠布局实现的图片上拉滑动,下拉图片放大,松手放大的效果,先看下效果图. 实现原理: 1.使用CoordinatorLayout ...

  8. (二)廖师兄springboot微信点餐虚拟机说明文档

    虚拟机 VirtualBox-5.1.22  系统 CentOS7.3账号 root密码 123456 软件:jdk 1.8.0_111nginx 1.11.7mysql 5.7.17redis 3. ...

  9. day01-系统基础信息模块

    前言:2015年,由于大规模采用云平台虚拟机部署应用,每套应用系统的MySQl.接口机.WEB服务器.文件服务器需要经常进行版本升级.配置更新.安全补丁加固.iptables调整.配置核实,大量的手工 ...

  10. bWAPP----Mail Header Injection (SMTP)

    Mail Header Injection (SMTP) 本地没有搭环境,没法演示,附上转载的 https://www.acunetix.com/blog/articles/email-header- ...