亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

IOS開發之路--C語言構造類型

2020-02-19 15:58:23
字體:
來源:轉載
供稿:網友

概述

在第一節中我們就提到C語言的構造類型,分為:數組、結構體、枚舉、共用體,當然前面數組的內容已經說了很多了,這一節將會重點說一下其他三種類型。

結構體 枚舉 共用體

結構體

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

//// main.c// ConstructedType//// Created by Kenshin Cui on 14-7-18.// Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#include //結構體類型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=%.2f/n",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)=%lu/n",sizeof(struct Date),sizeof(struct Person));  //結果:len(Date)=12,len(Person)=32  return 0;}

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

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

對第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個補齊長度,這里使用表格的形式列出了具體原因:

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

接下來看一下結構體數組、指向結構體的指針:

//// main.c// ConstructedType//// Created by Kenshin Cui on 14-7-18.// Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#include 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; iname,   p->age,   p->birthday.year,   p->birthday.month,   p->birthday.day,   p->height); /*輸出結果:  name=Kenshin,age=28,birthday=1986-8-8,height=1.72  */  return 0;}

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

枚舉

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

//// main.c// ConstructedType//// Created by Kenshin Cui on 14-7-18.// Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#include enum Season{ //默認情況下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); //結果:summer=1  for(season=spring;season

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

共用體

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

//// main.c// ConstructedType//// Created by Kenshin Cui on 14-7-20.// Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#include 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); //結果:address(Type)=5fbff7b8,address(t.a)=5fbff7b8,address(t.b)=5fbff7b8,address(t.c)=5fbff7b8  printf("len(Type)=%d/n",sizeof(union Type)); //結果:len(Type)=4  printf("t.a=%d,t.b=%d,t.c=%d/n",t.a,t.b,t.c); //結果:t.a=4,t.b=260,t.c=65796  return 0;}

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区美女视频在线观看免费| 亚洲人成在线免费观看| 97avcom| 亚洲福利在线观看| 成人午夜一级二级三级| 欧美午夜激情小视频| 亚洲自拍偷拍一区| 97精品国产97久久久久久| 久久亚洲精品小早川怜子66| 日韩高清av在线| 亚洲欧美国产精品专区久久| 国内自拍欧美激情| 亚洲精品一区中文字幕乱码| 91久久久久久久一区二区| 欧美成人精品在线播放| 久久久久久噜噜噜久久久精品| 国产成人精品电影久久久| 亚洲一区二区免费在线| 久久在线视频在线| 中文字幕亚洲一区在线观看| 国产中文欧美精品| 亚洲美女av在线| 欧美激情精品久久久久久黑人| 国产精品亚洲综合天堂夜夜| 欧美黑人性视频| 久久久91精品国产一区不卡| 亚洲一区二区三区在线视频| 久久免费精品日本久久中文字幕| 欧美亚洲一区在线| 亚洲国产精品专区久久| 日韩美女av在线| 欧美疯狂性受xxxxx另类| 欧美大尺度在线观看| 米奇精品一区二区三区在线观看| 自拍偷拍亚洲区| 久久久久国色av免费观看性色| 国产免费一区二区三区在线能观看| 91视频国产高清| 国模私拍视频一区| 精品二区三区线观看| 国产一区二区黑人欧美xxxx| 91精品国产高清久久久久久91| 国产成人在线亚洲欧美| 亚洲国产精久久久久久| 欧美在线视频观看免费网站| 欧美成aaa人片在线观看蜜臀| 5566日本婷婷色中文字幕97| 久久电影一区二区| 一个人www欧美| 精品国产自在精品国产浪潮| 亚洲国产成人精品女人久久久| 欧美成人免费va影院高清| 97**国产露脸精品国产| 欧美一级淫片丝袜脚交| 一个人看的www欧美| 日韩av一卡二卡| 欧美成人精品激情在线观看| 国产精品视频区1| 精品国产乱码久久久久酒店| 欧美精品久久久久久久免费观看| 亚洲综合第一页| 欧美成人久久久| 国产suv精品一区二区三区88区| 欧美尺度大的性做爰视频| 日韩精品中文字| 亚洲男人天堂网站| 国产中文欧美精品| 久久香蕉国产线看观看网| 狠狠色香婷婷久久亚洲精品| 亚洲国产99精品国自产| yellow中文字幕久久| 久久久久免费精品国产| 国产精品吴梦梦| 国产成人91久久精品| 欧美激情一区二区三区成人| 亚洲qvod图片区电影| 欧美大片在线看免费观看| 性欧美激情精品| 最近2019好看的中文字幕免费| 秋霞成人午夜鲁丝一区二区三区| 亚洲第一视频网站| 欧美性xxxx极品高清hd直播| 一区二区三区国产在线观看| 97香蕉超级碰碰久久免费软件| 精品少妇一区二区30p| 久久精品中文字幕免费mv| 精品国产一区二区三区久久久狼| 国产欧美日韩高清| 亚洲国产日韩欧美在线99| 国产69精品久久久久99| 91久久久国产精品| 亚洲激情在线观看| 久久久之久亚州精品露出| 国产精品情侣自拍| 欧美在线视频一二三| 欧美中文在线观看国产| 欧美电影免费观看高清完整| 成人欧美一区二区三区在线| 欧美日韩中文在线观看| 国产午夜精品理论片a级探花| 亚洲女人天堂av| 久久久国产精品亚洲一区| 中文字幕免费精品一区高清| 欧美精品一区二区免费| 国产精品热视频| 国产成人在线播放| 中文字幕在线亚洲| 97热在线精品视频在线观看| 欧美在线观看日本一区| 九九久久综合网站| 欧美性猛交xxxx免费看漫画| 久久精品国产免费观看| 日韩av电影手机在线| 亚洲一区二区三区乱码aⅴ蜜桃女| 日韩电影在线观看永久视频免费网站| 国产精品一区av| 国产午夜一区二区| 欧美wwwxxxx| 国产欧美一区二区白浆黑人| 成人黄色中文字幕| 91国产一区在线| 日韩电影免费观看在线观看| 欧美洲成人男女午夜视频| 亚洲在线www| 国产精品久久久久久久久久尿| 日韩经典中文字幕| 欧美日韩国产中文字幕| 97视频在线观看亚洲| 91av在线免费观看视频| 日韩大陆欧美高清视频区| 亚洲自拍偷拍第一页| 欧美成人免费va影院高清| 国产精品99导航| 国产精品日日摸夜夜添夜夜av| 亚洲白虎美女被爆操| 亚洲人线精品午夜| 亚洲免费影视第一页| 尤物九九久久国产精品的特点| 久久影院资源站| 国产精品视频在线播放| 国自在线精品视频| 欧美做受高潮电影o| 久久久精品久久久久| 久久国产精彩视频| 亚洲aaaaaa| 欧美另类老女人| 国产一区二区色| 日韩精品一二三四区| 国产精品激情av电影在线观看| 国产精品丝袜一区二区三区| 日韩精品在线视频美女| 国产精品久久久av久久久| 欧美大片免费观看| 韩剧1988在线观看免费完整版| 国产成人a亚洲精品| 国产一区香蕉久久| 亚洲剧情一区二区| 欧美影院成年免费版| 91黄色8090| 少妇高潮久久77777| 欧美黑人巨大精品一区二区| 日韩在线观看视频免费| 97成人精品视频在线观看| 国产精品影片在线观看|