一、结构

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. 共线性分析-MCscan - python (jcvi)

    本来是不会再写这个文档的,但是由于长时间没有用这个模块,这个模块不知道是我自己弄掉了,还是别的同学误删了,于是我重新安装一下. 首先下载conda,并下载好python which pip 直接安装 ...

  2. Java基础知识(三)

    一.hashCode 与 equals (重要) 面试官可能会问你:"你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?" 1 ...

  3. python爬虫02通过 Fiddler 进行手机抓包

    我们要用到一款强大免费的抓包工具 Fiddler你可以到 https://www.telerik.com/download/fiddler去下载 一般情况下 我们通过浏览器来请求服务器的时候 是点对点 ...

  4. Flutter(75):Sliver组件之SliverFixedExtentList

    Flutter教学目录持续更新中 Github源代码持续更新中 1.SliverFixedExtentList 可以固定Item高度的SliverList 2.SliverFixedExtentLis ...

  5. Linux7(centOS7)安装jdk/tomcat/docker/mysql

    jdk的rpm安装.tomcat的解压缩安装.docker的yum安装.mysql的docker安装 下载地址 1.1.jdk下载地址 https://www.oracle.com/java/tech ...

  6. UNP——第二章,端口号,套接字对,TCP,UDP输出

    1.端口号 端口号用于区分使用相同协议的进程. TCP69 与 UDP69 是不同的. 端口号范围 0 - 65535, 其中 0- 1023 是保留端口. 2.套接字对 TCP服务通过套接字对,唯一 ...

  7. MySQL 连接为什么挂死了?

    摘要:本次分享的是一次关于 MySQL 高可用问题的定位过程,其中曲折颇多但问题本身却比较有些代表性,遂将其记录以供参考. 一.背景 近期由测试反馈的问题有点多,其中关于系统可靠性测试提出的问题令人感 ...

  8. 部署sftp服务

    部署sftp服务有风险,可能造成ssh无法连接到服务器,因此写个脚本定时覆盖一下,保证ssh可以正常使用. 创建数据目录并赋权,创建账号密码,修改ssh文件. * mkdir /sftp groupa ...

  9. 算法:线性时间选择(C/C++)

    Description 给定线性序集中n个元素和一个整数k,n<=2000000,1<=k<=n,要求找出这n个元素中第k小的数. Input 第一行有两个正整数n,k. 接下来是n ...

  10. HDU100题简要题解(2050~2059)

    HDU2050 折线分割平面 题目链接 Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以 ...