结构体传值:

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

typedef struct {
int id;
int num;
char name[100];
} Produts; //传入指针,加const修饰,防止程序修改
void test(Produts const *ptr);

位段:

结构体可以实现位段,位段的声明和结构体类型,但是成员是多个位的字段,不同长度的字段储存在一个或多个整形变量中。位段的类型必须声明成int,signed,unsigned int 类型,其次,成员名后面时一个冒号,和一个整数,整数指定位段所占位数目:

struct CHAR {
unsigned ch : 7;
unsigned font : 6;
unsigned size : 19;
};

占32位,对于16位机器来说,size超过了整型长度,所以是不可移植的。位段的长处是节省空间,和对位的操作更方便。

联合union

联合可以看成在某个位子上可以储存不同类型的值,但是只能储存一个,联合的成员引用的是内存中相同的位置,可以在不同时刻,把不同的东西存在同一个位置。

#include <stdio.h>

union {
float f;
int i;
char * str;
} var; int main()
{
var.f = 12.3;
printf("%g\n", var.f); var.i = 111;
printf("%d\n", var.i); var.str = "hello";
printf("%s\n", var.str);
return 0;
}

var联合可以储存浮点数,整数和字符串指针,根据不同的类型,读取出不同的值。但是联合一次只可以储存一个值,所以在函数中使用时,无法确定所储存的类型,如果和struct一起使用可以添加一个标示代表所储存的类型。

#include <stdio.h>
//类型var可以放整数,浮点,字符串指针。
typedef struct {
enum {INT, FLOAT, STRING} type;
union {
int i;
float f;
char * str;
} value;
} var;
//根据类型读取值
void checkVar(var variable)
{
switch(variable.type){
case 0:
printf("int %d\n", variable.value.i);
break; case 1:
printf("float %g\n", variable.value.f);
break; case 2:
printf("string %s\n", variable.value.str);
break; default:
printf("not valid type");
break;
}
}
int main()
{
var variable1;
variable1.type = 0;
variable1.value.i = 11;
checkVar(variable1); variable1.type = 1;
variable1.value.f = 11.11;
checkVar(variable1); variable1.type = 2;
variable1.value.str = "yangxunwu";
checkVar(variable1);
return 0;
}

注意:联合的初始化值必须时第一个成员类型,如果是其他类型,那么会发生类型转换成为一个整数。

C和指针 第十章 结构和联合 (二)的更多相关文章

  1. C和指针 第十章 结构和联合 (一)

    结构体: 聚合数据类型是指,能够同时存储超过一个的单独数据,C语言中有两个聚合数据类型,数组和结构体.数组中储存的类型必须相同,元素通过下标和指针引用来访问的. 结构体也是一些值的集合,但是结构体中每 ...

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

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

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

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

  4. C和C指针小记(十五)-结构和联合

    1.结构 1.1 结构声明 在声明结构时,必须列出它包含的所有成员.这个列表包括每个成员的类型和名称. struct tag {member-list} variable-list; 例如 //A s ...

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

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

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

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

  7. C++笔记--指针数组和结构

    指针 类型为T*的变量能保存一个类型T对象的地址 Char c=‘a’:Char * p=& c://保存了c的地址 指针的操作一般都是间接的引用,就是相当于引用指针所指的对象. 0是一个特殊 ...

  8. C语言入门第十章----结构体

    C语言结构体从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由int.char .float等基本类型组成的,你可以认为结构体是一种聚合类型. 在实际开发中,我们可以将一组类型不同的. ...

  9. C++二级指针第二种内存模型(二维数组)

    C++二级指针第二种内存模型(二维数组) 二维数组 二维数组本质上是以数组作为数组元素的数组,即“数组的数组”. 定义 类型说明符 数组名[常量表达式][常量表达式] 例如: float a[3][4 ...

随机推荐

  1. iOS逆向工程资料

    链接: 基于iOS逆向工程的微信机器人 - 猫友会大讲坛第1期 我的失败与伟大 —— 创业必备的素质(狗神经验谈)

  2. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 角色权限的配置页面改进优化

    往往开发的人不是维护的人,开发的单位不是维护的单位.信息的畅通沟通交流很多时候会有打折.扭曲.甚至是容易得到歪解.配置错业务操作权限.为了防止发生没必要的麻烦,甚至是发生重大错误,我们的软件需要不断换 ...

  3. jquery 停止动画 stop的几种用法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. [word]用Word2007查找和替换功能批量设置图片位置

    Word2007的"查找和替换"功能并不仅仅可以对文字进行批量的查找替换,还有很多神奇的功能,比如对插入的图片位置进行批量的查找和调整等等. 今天我们就来试试Word2007的&q ...

  5. SQL Left Join, Right Join, Inner Join, and Natural Join 各种Join小结

    在SQL语言中,存在着各种Join,有Left Join, Right Join, Inner Join, and Natural Join等,对于初学者来说肯定一头雾水,都是神马跟神马啊,它们之间到 ...

  6. 集合覆盖 顶点覆盖: set cover和vertex cover

    这里将讲解一下npc问题中set cover和vertex cover分别是什么. set cover: 问题定义: 实例:现在有一个集合A,其中包含了m个元素(注意,集合是无序的,并且包含的元素也是 ...

  7. C++标准库:std_map作为一个关联数组

    摘要:std::map作为一个容器存在一个典型应用就是作为关联数组来作用.在诸如Java等等语言中,关联数组广泛存在.std::map是一个容器,在它的概念框架中存在两个词:键和值,std::map把 ...

  8. django request对象和HttpResponse对象

    HttpRequest对象(除非特殊说明,所有属性都是只读,session属性是个例外)HttpRequest.scheme 请求方案(通常为http或https)HttpRequest.body 字 ...

  9. 【OpenJudge 8463】Stupid cat & Doge

    http://noi.openjudge.cn/ch0204/8463/ 挺恶心的一道简单分治. 一开始准备非递归. 大if判断,后来发现代码量过长,决定大打表判断后继情况,后来发现序号不对称. 最后 ...

  10. Asp.Net MVC<九>:OWIN,关于StartUp.cs

    https://msdn.microsoft.com/zh-cn/magazine/dn451439.aspx(Katana 项目入门) 一不小心写了个WEB服务器 快刀斩乱麻之 Katana OWI ...