IOS开发之路--C语言构造类型

2016-02-19 11:29 4 1 收藏

今天图老师小编要跟大家分享IOS开发之路--C语言构造类型,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

【 tulaoshi.com - 编程语言 】

概述

在第一节中我们就提到C语言的构造类型,分为:数组、结构体、枚举、共用体,当然前面数组的内容已经说了很多了,这一节将会重点说一下其他三种类型。

结构体 枚举 共用体

结构体

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

数组中存储的是一系列相同的数据类型,那么如果想让一个变量存储不同的数据类型就要使用结构体,结构体定义类似于C++、C#、Java等高级语言中类的定义,但事实上它们又有着很大的区别。结构体是一种类型,并非一个变量,只是这种类型可以由其他C语言基本类型共同组成。

//// main.c// ConstructedType//// Created by Kenshin Cui on 14-7-18.// Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#include stdio.h//结构体类型Datestruct Date{ int year; int month; int day;};struct Person{ char *name; int age; struct Date birthday;//一个结构体中使用了另一个结构体类型,结构体类型变量声明前必须加上struct关键字 float height;};int main(int argc, const char * argv[]) { struct Person p={"Kenshin",28,{1986,8,8},1.72}; //定义结构体变量并初始化,不允许先定义再初始化,例如:struct Person p;p={"Kenshin",28,{1986,8,8},1.72};是错误的  printf("name=%s,age=%d,birthday=%d-%d-%d,height=%.2fn",p.name,p.age,p.birthday.year,p.birthday.month,p.birthday.day,p.height);  //结果:name=Kenshin,age=28,birthday=1986-8-8,height=1.72,结构体的引用是通过"结构体变量.成员名称"  printf("len(Date)=%lu,len(Person)=%lun",sizeof(struct Date),sizeof(struct Person));  //结果:len(Date)=12,len(Person)=32  return 0;}

对于上面的例子需要做出如下说明:

可以在定义结构体类型的同时声明结构体变量;
如果定义结构体类型的同时声明结构体变量,此时结构体名称可以省略;
定义结构体类型并不会分配内存,在定义结构体变量的时候才进行内存分配(同基本类型时类似的);
结构体类型的所占用内存大型等于所有成员占用内存大小之和(如果不考虑内存对齐的前提下);

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

对第4点需要进行说明,例如上面代码是在64位编译器下运行的结果(int长度4,char长度1,float类型4),Date=4+4+4=12。但是对于Person却没有那么简单了,因为按照正常方式计算Person=8+4+12+4=28,但是从上面代码中给出的结果是32,为什么呢?这里不得不引入一个概念“内存对齐”,关于内存对齐的概念在这里不做详细说明,大家需要了解的是:在Mac OS X中对齐参数默认为8(可以通过在代码中添加#pragma pack(8)改变对齐参数),如果结构体中的类型不大于8,那么结构体长度就是其成员类型之和,但是如果成员变量的长度大于这个对齐参数那么得到的结果就不一定是各个成员变量之和了。Person类型的长度之所以是32,其实主要原因是因为Date类型长度12在存储时其偏移量12不是8的倍数,考虑到内存对齐的原因需要添加4个补齐长度,这里使用表格的形式列出了具体原因:

表格具体

来源:https://www.tulaoshi.com/n/20160219/1597704.html

延伸阅读
/*********************************** 作者:trieagle(让你望见影子的墙) 日期:2009.8.14 注: 转载请保留此信息 ************************************/ 使用c#构造date数据类型 在sql server2005没有实现date类型,但是提供了很好的扩展性,可以利用CLR来构造date类型。有一部分是参考了Fc的代码写的。 步骤: 1、在vs 2005中新建...
布尔类型对象可以被赋予文字值true或者false,所对应的关系就是真于假的概念! 我们通常使用的方法是利用他来判定条件的真于假,例如如下的代码: C++ 代码 //程序作者:管宁 //站点:www.cndev-lab.com //所有稿件均有版权,如要转载,请务必闻名出处和作者 #include iostream using ...
算术表达式 是由算术运算符和括号连接起来的式子, 以下是算术表达式的例子: a+b (a*2)/c (x+r)*8-(a+b)/7 ++i sin(x)+sin(y) (++i)-(j++)+(k--) 赋值运算符和赋值表达式 简单赋值运算符和表达式,简单赋值运算符记为“=”。由“= ”连接的式子称为赋值表达式。其一般形式为: 变量=表...
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后天天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 1.程序分析:采取逆向思维的方法,从后往前推断。 ...
基本运算符和表达式 运算符的种类、优先级和结合性 C语言中运算符和表达式数量之多, 在高级语言中是少见的。正是丰富的运算符和表达式使C语言功能十分完善。 这也是C语言的主要特点之一。 C语言的运算符不仅具有不同的优先级, 而且还有一个特点,就是它的结合性。在表达式中, 各运算量参与运算的先后顺序...

经验教程

741

收藏

34
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部