pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

IOS開發(fā)之路--C語言構(gòu)造類型

在第一節(jié)中我們就提到C語言的構(gòu)造類型,分為:數(shù)組、結(jié)構(gòu)體、枚舉、共用體,當(dāng)然前面數(shù)組的內(nèi)容已經(jīng)說了很多了,這一節(jié)將會重點說一下其他三種類型。

概述

在第一節(jié)中我們就提到C語言的構(gòu)造類型,分為:數(shù)組、結(jié)構(gòu)體、枚舉、共用體,當(dāng)然前面數(shù)組的內(nèi)容已經(jīng)說了很多了,這一節(jié)將會重點說一下其他三種類型。

結(jié)構(gòu)體 枚舉 共用體

結(jié)構(gòu)體

數(shù)組中存儲的是一系列相同的數(shù)據(jù)類型,那么如果想讓一個變量存儲不同的數(shù)據(jù)類型就要使用結(jié)構(gòu)體,結(jié)構(gòu)體定義類似于C++、C#、Java等高級語言中類的定義,但事實上它們又有著很大的區(qū)別。結(jié)構(gòu)體是一種類型,并非一個變量,只是這種類型可以由其他C語言基本類型共同組成。


//
// main.c
// ConstructedType
//
// Created by Kenshin Cui on 14-7-18.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#include <stdio.h>

//結(jié)構(gòu)體類型Date
struct Date{
 int year;
 int month;
 int day;
};

struct Person{
 char *name;
 int age;
 struct Date birthday;//一個結(jié)構(gòu)體中使用了另一個結(jié)構(gòu)體類型,結(jié)構(gòu)體類型變量聲明前必須加上struct關(guān)鍵字
 float height;
};

int main(int argc, const char * argv[]) {
 struct Person p={"Kenshin",28,{1986,8,8},1.72};
 //定義結(jié)構(gòu)體變量并初始化,不允許先定義再初始化,例如:struct Person p;p={"Kenshin",28,{1986,8,8},1.72};是錯誤的
 
 printf("name=%s,age=%d,birthday=%d-%d-%d,height=%.2f\n",p.name,p.age,p.birthday.year,p.birthday.month,p.birthday.day,p.height); 
 //結(jié)果:name=Kenshin,age=28,birthday=1986-8-8,height=1.72,結(jié)構(gòu)體的引用是通過"結(jié)構(gòu)體變量.成員名稱"
 
 printf("len(Date)=%lu,len(Person)=%lu\n",sizeof(struct Date),sizeof(struct Person)); 
 //結(jié)果:len(Date)=12,len(Person)=32
 
 return 0;
}

對于上面的例子需要做出如下說明:

可以在定義結(jié)構(gòu)體類型的同時聲明結(jié)構(gòu)體變量;
如果定義結(jié)構(gòu)體類型的同時聲明結(jié)構(gòu)體變量,此時結(jié)構(gòu)體名稱可以省略;
定義結(jié)構(gòu)體類型并不會分配內(nèi)存,在定義結(jié)構(gòu)體變量的時候才進行內(nèi)存分配(同基本類型時類似的);
結(jié)構(gòu)體類型的所占用內(nèi)存大型等于所有成員占用內(nèi)存大小之和(如果不考慮內(nèi)存對齊的前提下);

對第4點需要進行說明,例如上面代碼是在64位編譯器下運行的結(jié)果(int長度4,char長度1,float類型4),Date=4+4+4=12。但是對于Person卻沒有那么簡單了,因為按照正常方式計算Person=8+4+12+4=28,但是從上面代碼中給出的結(jié)果是32,為什么呢?這里不得不引入一個概念“內(nèi)存對齊”,關(guān)于內(nèi)存對齊的概念在這里不做詳細說明,大家需要了解的是:在Mac OS X中對齊參數(shù)默認(rèn)為8(可以通過在代碼中添加#pragma pack(8)改變對齊參數(shù)),如果結(jié)構(gòu)體中的類型不大于8,那么結(jié)構(gòu)體長度就是其成員類型之和,但是如果成員變量的長度大于這個對齊參數(shù)那么得到的結(jié)果就不一定是各個成員變量之和了。Person類型的長度之所以是32,其實主要原因是因為Date類型長度12在存儲時其偏移量12不是8的倍數(shù),考慮到內(nèi)存對齊的原因需要添加4個補齊長度,這里使用表格的形式列出了具體原因:

表格具體來源請觀看下面的視頻(注意由于錄制軟件的原因前幾秒不清晰但是不影響分析):

接下來看一下結(jié)構(gòu)體數(shù)組、指向結(jié)構(gòu)體的指針:


//
// main.c
// ConstructedType
//
// Created by Kenshin Cui on 14-7-18.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#include <stdio.h>

struct Date{
 int year;
 int month;
 int day;
};

struct Person{
 char *name;
 int age;
 struct Date birthday;
 float height;
};

void changeValue(struct Person person){
 person.height=1.80;
}

int main(int argc, const char * argv[]) {
 struct Person persons[]={
  {"Kenshin",28,{1986,8,8},1.72},
  {"Kaoru",27,{1987,8,8},1.60},
  {"Rosa",29,{1985,8,8},1.60}
 };
 for (int i=0; i<3; ++i) {
  printf("name=%s,age=%d,birthday=%d-%d-%d,height=%.2f\n",
    persons[i].name,
    persons[i].age,
    persons[i].birthday.year,
    persons[i].birthday.month,
    persons[i].birthday.day,
    persons[i].height);
 }
 /*輸出結(jié)果:
  name=Kenshin,age=28,birthday=1986-8-8,height=1.72
  name=Kaoru,age=27,birthday=1987-8-8,height=1.60
  name=Rosa,age=29,birthday=1985-8-8,height=1.60
  */
 
 
 
 struct Person person=persons[0];
 changeValue(person);
 printf("name=%s,age=%d,birthday=%d-%d-%d,height=%.2f\n",
   persons[0].name,
   persons[0].age,
   persons[0].birthday.year,
   persons[0].birthday.month,
   persons[0].birthday.day,
   persons[0].height);
 /*輸出結(jié)果:
  name=Kenshin,age=28,birthday=1986-8-8,height=1.72
  */
 
 
 struct Person *p=&person;
 printf("name=%s,age=%d,birthday=%d-%d-%d,height=%.2f\n",
   (*p).name,
   (*p).age,
   (*p).birthday.year,
   (*p).birthday.month,
   (*p).birthday.day,
   (*p).height);
 /*輸出結(jié)果:
  name=Kenshin,age=28,birthday=1986-8-8,height=1.72
  */
 printf("name=%s,age=%d,birthday=%d-%d-%d,height=%.2f\n",
   p->name,
   p->age,
   p->birthday.year,
   p->birthday.month,
   p->birthday.day,
   p->height);
 /*輸出結(jié)果:
  name=Kenshin,age=28,birthday=1986-8-8,height=1.72
  */
 
 return 0;
}

結(jié)構(gòu)體作為函數(shù)參數(shù)傳遞的是成員的值(值傳遞而不是引用傳遞),對于結(jié)構(gòu)體指針而言可以通過”->”操作符進行訪問。

枚舉

枚舉類型是比較簡單的一種數(shù)據(jù)類型,事實上在C語言中枚舉類型是作為整形常量進行處理的,通常稱為“枚舉常量”。


//
// main.c
// ConstructedType
//
// Created by Kenshin Cui on 14-7-18.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#include <stdio.h>

enum Season{ //默認(rèn)情況下spring=0,summer=1,autumn=2,winter=3
 spring,
 summer,
 autumn,
 winter
};

int main(int argc, const char * argv[]) {
 enum Season season=summer; //枚舉賦值,等價于season=1
 printf("summer=%d\n",season); //結(jié)果:summer=1
 
 for(season=spring;season<=winter;++season){
  printf("element value=%d\n",season);
 }
 /*結(jié)果:
  element value=0
  element value=1
  element value=2
  element value=3
  */
 return 0;
}

需要注意的是枚舉成員默認(rèn)值從0開始,如果給其中一個成員賦值,其它后面的成員將依次賦值,例如上面如果summer手動指定為8,則autumn=9,winter=10,而sprint還是0。

共用體

共用體又叫聯(lián)合,因為它的關(guān)鍵字是union(貌似數(shù)據(jù)庫操作經(jīng)常使用這個關(guān)鍵字),它的使用不像枚舉和結(jié)構(gòu)體那么頻繁,但是作為C語言中的一種數(shù)據(jù)類型我們也有必要弄清它的用法。從前面的分析我們知道結(jié)構(gòu)體的總長度等于所有成員的和(當(dāng)然此時還可能遇到對齊問題),但是和結(jié)構(gòu)體不同的是共用體所有成員共用一塊內(nèi)存,順序從低地址開始存放,一次只能使用其中一個成員,union最終大小由共用體中最大的成員決定,對某一成員賦值可能會覆蓋另一個成員。


//
// main.c
// ConstructedType
//
// Created by Kenshin Cui on 14-7-20.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#include <stdio.h>

union Type{
 char a;
 short int b;
 int c;
};

int main(int argc, const char * argv[]) {
 union Type t;
 t.a='a';
 t.b=10;
 t.c=65796;
 
 printf("address(Type)=%x,address(t.a)=%x,address(t.b)=%x,address(t.c)=%x\n",&t,&t.a,&t.b,&t.c);
 //結(jié)果:address(Type)=5fbff7b8,address(t.a)=5fbff7b8,address(t.b)=5fbff7b8,address(t.c)=5fbff7b8
 
 printf("len(Type)=%d\n",sizeof(union Type));
 //結(jié)果:len(Type)=4
 
 printf("t.a=%d,t.b=%d,t.c=%d\n",t.a,t.b,t.c);
 //結(jié)果:t.a=4,t.b=260,t.c=65796
 
 return 0;
}

這里需要重點解釋一個問題:為什么t.a、t.b、t.c輸出結(jié)果分別是4、260、65796,當(dāng)然t.c等于65796并不奇怪,但是t.a前面賦值為'a'不應(yīng)該是97嗎,而t.b不應(yīng)該是10嗎?其實如果弄清這個問題共用體的概念基本就清楚了。

根據(jù)前面提到的,共用體其實每次只能使用其中一個成員,對于上面的代碼經(jīng)過三次賦值最終使用的其實就是t.c,而通過上面的輸出結(jié)果我們也確實看到c是有效的。共用體有一個特點就是它的成員存儲在同一塊內(nèi)存區(qū)域,這塊區(qū)域的大小需要根據(jù)它的成員中長度最大的成員長度而定。由于上面的代碼是在64位編譯器下編譯的,具體長度:char=1,short int=2,int=4,所以得出結(jié)論,Type的長度為4,又根據(jù)上面輸出的地址,可以得到下面的存儲信息(注意數(shù)據(jù)的存儲方式:高地址存儲高位,低地址存儲地位):

當(dāng)讀取c的時候,它的二進制是“00000000 00000001 00000001 00000100”,換算成十進制就是65796;而經(jīng)過三次賦值后,此時b的存儲就已經(jīng)被c成員的低位數(shù)據(jù)覆蓋,b的長度是二,所以從起始地址取兩個字節(jié)得到的二進制數(shù)據(jù)此時是“00000001 00000100”(b原來的數(shù)據(jù)已經(jīng)被c低2位數(shù)據(jù)覆蓋,其實此時就是c的低2位數(shù)據(jù)),換算成十進制就是260;類似的a此時的數(shù)據(jù)就是c的低一位數(shù)據(jù)”00000100”,換算成十進制就是4。

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

這篇文章主要介紹了ios實現(xiàn)文件對比的方法,主要是用到了filemanager,有需要的小伙伴可以參考下。
這篇文章主要給大家匯總了一下ios下移動文件方法,從簡單到復(fù)雜,十分的實用,有需要的小伙伴可以參考下。
本文給大家總結(jié)了幾則在IOS系統(tǒng)下刪除文件的代碼,十分的實用,有需要的小伙伴可以參考下。
本文給大家分享的是IOS開發(fā)中遇到的一個手風(fēng)琴特效無法正常工作的問題的解決方法,經(jīng)過度娘了很久才找到解決方法,這里推薦給大家,有需要的小伙伴可以參考下。
這篇文章主要介紹了iOS、Mac OS X系統(tǒng)中編程實現(xiàn)漢字轉(zhuǎn)拼音的方法(超級簡單),本文講解的方法不僅支持中文,還支持日文、韓文等,需要的朋友可以參考下
這篇文章主要分享了iOS7 毛玻璃特效代碼,非常的實用,做IOS開發(fā)的童鞋們不要錯過了
主站蜘蛛池模板: 洛阳永磁工业大吊扇研发生产-工厂通风降温解决方案提供商-中实洛阳环境科技有限公司 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 环境模拟实验室_液体-气体控温机_气体控温箱_无锡双润冷却科技有限公司 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 5L旋转蒸发器-20L-50L旋转蒸发器-上海越众仪器设备有限公司 | 搅拌磨|搅拌球磨机|循环磨|循环球磨机-无锡市少宏粉体科技有限公司 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 电地暖-电采暖-发热膜-石墨烯电热膜品牌加盟-暖季地暖厂家 | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 全自动过滤器_反冲洗过滤器_自清洗过滤器_量子除垢环_量子环除垢_量子除垢 - 安士睿(北京)过滤设备有限公司 | 手表腕表维修保养鉴定售后服务中心网点 - 名表维修保养 | 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | PTFE接头|聚四氟乙烯螺丝|阀门|薄膜|消解罐|聚四氟乙烯球-嘉兴市方圆氟塑制品有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 柴油机_柴油发电机_厂家_品牌-江苏卡得城仕发动机有限公司 | 固诺家居-全屋定制十大品牌_整体衣柜木门橱柜招商加盟 | _网名词典_网名大全_qq网名_情侣网名_个性网名 | 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | 智能交通网_智能交通系统_ITS_交通监控_卫星导航_智能交通行业 | 诸城网站建设-网络推广-网站优化-阿里巴巴托管-诸城恒泰互联 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 高清视频编码器,4K音视频编解码器,直播编码器,流媒体服务器,深圳海威视讯技术有限公司 | 网站优化公司_北京网站优化_抖音短视频代运营_抖音关键词seo优化排名-通则达网络 | 真空泵维修保养,普发,阿尔卡特,荏原,卡西亚玛,莱宝,爱德华干式螺杆真空泵维修-东莞比其尔真空机电设备有限公司 | 上海风淋室_上海风淋室厂家_上海风淋室价格_上海伯淋 | 河南中专学校|职高|技校招生-河南中职中专网 | 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 电磁流量计厂家_涡街流量计厂家_热式气体流量计-青天伟业仪器仪表有限公司 | 螺旋丝杆升降机-SWL蜗轮-滚珠丝杆升降机厂家-山东明泰传动机械有限公司 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | POS机办理_个人pos机免费领取-银联pos机申请首页| 恒温槽_恒温水槽_恒温水浴槽-上海方瑞仪器有限公司 | 玻纤土工格栅_钢塑格栅_PP焊接_单双向塑料土工格栅_复合防裂布厂家_山东大庚工程材料科技有限公司 | 浙江宝泉阀门有限公司 | 杭州代理记账多少钱-注册公司代办-公司注销流程及费用-杭州福道财务管理咨询有限公司 | 河南生物显微镜,全自动冰冻切片机-河南荣程联合科技有限公司 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 |