国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

IOS基礎學習之C(一)

2019-11-07 23:56:46
字體:
來源:轉載
供稿:網(wǎng)友

iOS開發(fā)的核心語言是Objective-C,Objective-C是在C語言的基礎加了一層面向對象的語法。為了能夠更好地掌握Objective-C,我們可以先學習C語言,然后在C語言的基礎上升華到Objective-C。

C語言: 是編譯型語言; *C語言于1972年發(fā)明,首次使用是用于重寫UINX操作系統(tǒng)(UNIX以前是用匯編寫的) *C語言是一門面向過程的語言,非面向對象的語言 ++ 特點: *弱語法; *提供了34種運算符; 有豐富的數(shù)據(jù)類型;整型(int)、float、char、int[]、指針類型(void )、結構體類型(struct)、共用體類型(union)等; *允許直接訪問物理地址,對硬件進行操作;最強大的是指針,可通過指針直接訪問內存地址,使用得當,可節(jié)省代碼量,優(yōu)化內存管理、提高性能; *具有高級語言的功能,又具有低級語言的許多功能能如匯編語言一樣對位(bit)、字節(jié)和地址進行操作(這三者是計算機工作的基本單元); *高效率的目標代碼;可讀性好,易于調試,修改和移植,代碼質量與匯編相當; *可移植性好;在一個環(huán)境上用C語言編寫的程序,不改動或稍加改動,就可移植到另一個完全不同的環(huán)境中;

**不足: *由于C語言是面向過程的,因此它的數(shù)據(jù)封裝性差、安全性低,這就是C語言和其他面向對象語言的區(qū)別之一。面向對象語言的特性之一就是數(shù)據(jù)的封裝性; *語法限制不嚴格,對變量的類型約束不嚴格,對數(shù)組下標越界不作檢查等; +使用: *由于C語言具有強大的數(shù)據(jù)處理能力,而且允許直接訪問物理地址,直接對硬件操作,因此它適于編寫系統(tǒng)軟件、圖形處理、單片機程序、嵌入式系統(tǒng)開發(fā)甚至是用于科研; * 很多操作系統(tǒng)的底層都是用C語言寫的,比如android; *iOS開發(fā)中的核心語言是Objective-C(簡稱OC),OC是在C語言的基礎上加了一層面向對象語法; +標準:1983年美國國家標準局(American National Standards Institute,簡稱ANSI)成立了一個委員會,開始制定C語言標準的工作。1989年C語言標準被批準,這個版本的C語言標準通常被稱為ANSI C; — Xcode中的C語言是在標準的C 語言上做了一些封裝; +語法: [goto語句一般很少使用,會破壞程序的結構;占位符同android string;%f 默認6位小數(shù);]

blob9.png

函數(shù)(方法): 以#開頭為預處理指令;在編譯之前執(zhí)行的指令;include的作用只是把后面<**>中的內容拷貝到該處; 若導入的文件是系統(tǒng)自帶的文件用<>,自己寫的文件用””; .h稱為頭文件;用來聲明一些常用的函數(shù);若想使用這些函數(shù),就必須包含這個頭文件;函數(shù)具體的實現(xiàn)是放在其他文件的; 一個C程序只有一個入口main函數(shù); 面向過程:就是先分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn),使用的時候一個一個依次調用函數(shù)就可以了;(只寫函數(shù),不使用對象) 一個C程序中一定會有一個main函數(shù),也只能有一個main函數(shù)。main函數(shù)是整個C程序的入口。main.c的第3行代碼就定義了一個main函數(shù)。 main函數(shù)的返回值為int類型,接收2個參數(shù),其實可以不寫參數(shù); main函數(shù)沒有寫返回值類型,并不代表函數(shù)沒有返回值,而是表示返回值類型為int類型,void才代表函數(shù)沒有返回值;可直接寫main(){…}

+運行過程: blob10.png

目標代碼須和C 語言的函數(shù)庫鏈接在一起,找個頭文件中的引用的函數(shù)名的實現(xiàn)生成的機器代碼才能運行。

+1+ 編寫程序

C語言源文件的擴展名為”.c”,源文件以ASCII碼形式存儲,不能直接被計算機執(zhí)行; +2+ 編譯(VC)[main.c—>main.obj] 1)把C的源程序翻譯成計算機可以識別的二進制形式的目標代碼文件,這個過程稱為編譯,由C的編譯器完成 2)在編譯的同時,還對源程序的語法等進行檢查。若出現(xiàn)語法錯誤,則編譯失敗。如果編譯成功則生成目標文件,目標文件名跟源程序文件名一樣,擴展名為”.obj”。比如,mj.c編譯后生成目標文件mj.obj 3)每個源文件是單獨進行編譯的,假如一個項目中有多個.c源文件,編譯成功會生成多個對應的.obj目標。一般情況下,目標文件之間是有關聯(lián)的,比如 a.obj 可能會調用 b.obj 中定義的一個函數(shù),因此它們都不能夠單獨被計算機執(zhí)行,而且目標文件中并不包含程序運行所需要的庫函數(shù)等 頭文件不會被編譯; +3+ 鏈接(VC下) 將所有有關聯(lián)的obj目標文件,以及系統(tǒng)提供的C庫函數(shù)等組合在一起生成可執(zhí)行文件的過程,稱為”鏈接” 鏈接生成的可執(zhí)行文件的文件名跟源程序文件同名,(win下)擴展名為”.exe”,計算機可以直接執(zhí)行; +4+ 運行 win下的.exe;Mac下為exec,雙擊即可執(zhí)行;

函數(shù): 主函數(shù):main;有且只有一個;不論什么位置,都是從main 開始執(zhí)行; 自定義函數(shù): C庫提供的庫函數(shù); ++ 聲明與定義: 在標準C語言中,是從上向下編譯,故只有后面的函數(shù)才能調用前面定義過的函數(shù); [在使用中可將函數(shù)名在mian()方法前聲明,在項目開發(fā)中,為了分模塊開發(fā),一般會將函數(shù)的聲明和定義(實現(xiàn))分別放在2個文件中,函數(shù)聲明放在.h頭文件中,函數(shù)定義放在.c源文件中;這樣使項目結構清晰。] (由于include只是拷貝,可直接include “header.c”;但不能重復導入頭文件,故一般不這樣寫;””的方式是先在當前源程序下找,若打不到,再到系統(tǒng)的path中找;<>是只在c語言庫函數(shù)文件中找) —-[函數(shù)在整個項目中不允許重復定義,不支持重載]—- 形參和實參:若是基本數(shù)據(jù)類型作為函數(shù)的形參,那就是簡單的傳遞,將實參賦值給了形參b;和b是分別有著不同內存地址的2個變量,因此改變了形參b的值,并不會影響實參a的值。

PRintf(): 占位符: %d 整型,%4d表示占用4個位置空間; %s String %c char 只能表示一個字符,但一個中文至少占用兩個字符; %f 浮點數(shù);%.2f表示保留兩位小數(shù);默認六位小數(shù); %o 以不帶符號的八進制輸出 %x 以不帶符號的十六進制輸出 %e 以標準指數(shù)形式輸出單、雙精度數(shù),數(shù)字部分小數(shù)位為6位

scanf 阻塞式函數(shù),不輸入不向下執(zhí)行; 要對變量進行賦值,須使用地址和占位符;如:int a;scanf(“%d”,&a); &a表示變量a的地址; scanf(“%d-%d”,&a,&b);則輸入也須是a-b的形式;

數(shù)據(jù)類型 blob11.png 結構體,類似class ;共用體很少使用; int 整型 2個字節(jié); float 單精度浮點型 4個字節(jié) double 雙精度浮點型 8個字節(jié) char 字符型 1個字節(jié),同java,只能存儲一個字符(不能是中文,同java); 變量:若未初始化會自動賦值(全局變量會為0(int),但局部變量可能是一個隨機數(shù),必須初始化后再使用,更安全); 類型修飾符: short 短型;short int =1;限制取值范圍; long 長型;擴展int的取值范圍;long a=1;等同于 long int a=1;(C中無long型,long只是一個修飾符) signed 有符號型;signed int a=1;等同于int a=1;可為正數(shù)也可為負; unsigned 無符號型;只能為正數(shù)或0; 可同時使用 unsigned long int a=5; [不同的編譯器,取值范圍不同;] 基本語句(同java) 基本運算(同java) 但由于C沒有boolean故沒有true和false;用1和0來表示true和false; 如:5>4 —> 1; 5<4 —>0; ** 在if語句中,所有非0(包括負數(shù))的值都為真(true) [NOTE:像a==0這樣的表達式,最好寫成0==a。因為若誤寫成0=a,編譯器會直接報錯,而a=0是不會報錯的。] ** 在C中,可以不保存關系去處的結果;如:a>10;a==0; ** && 與 || 同Java 也是阻斷式的; +逗號表達式; 返回值為最后一個表達式的值;如: int e=2,f=4;     int g = (++e,e*f); g—>12; 若int g = ++e,e*f;則相當于g=(++e),值為3;

+sizeof 用于得到數(shù)據(jù)占用的字節(jié)長度,返回值為size_t(即unsigned long,可直接使用int);使用 size_t size=sizeof(a);

地址計算機中的內存是以字節(jié)為單位的存儲空間。內存的每一個字節(jié)都有一個唯一的編號,這個編號就稱為地址。 *凡存放在內存中的程序和數(shù)據(jù)都有一個地址,也就是說,一個函數(shù)也有自己的內存地址。 *當定義一個變量時,系統(tǒng)就分配一個帶有唯一地址的存儲單元來存儲這個變量。變量存儲單元的第一個字節(jié)的地址就是該變量的地址。 獲取地址: *&**a; +數(shù)組 只能是int a[5];的形式(int[5] a;int[] b;int a[];int i=0;int a[i]均錯誤。int)

[]里面的個數(shù)必須是一個固定值,可以是常量(比如6、8)、常量表達式(比如3+4、5*7)。絕對不能使用變量或者變量表達式來表示元素個數(shù),大多數(shù)情況下不要省略元素個數(shù)(當數(shù)組作為函數(shù)的形參和數(shù)組初始化時除外)

*一維數(shù)組 定義數(shù)組時,系統(tǒng)將按照數(shù)組類型和個數(shù)分配一段連續(xù)的存儲空間來存儲數(shù)組元素,如int a[3]占據(jù)了連續(xù)的6字節(jié)存儲空間(在16位編譯器環(huán)境下,一個int類型占用2個字節(jié))。要注意的是,數(shù)組名代表著整個數(shù)組的地址,也就是數(shù)組的起始地址。 其實a不算是變量,是個常量,它代表著數(shù)組的地址,不能對其賦值[int a[2];a={1,2};//是錯誤的]。] 數(shù)組a的地址是ffc1,a[0]的地址是ffc1,a[1]的地址是ffc3,a[2]的地址是ffc5。因此a == &a[0],即第一個元素的地址就是整個數(shù)組的地址 [數(shù)組名代表的就是數(shù)組的地址,也就是第0個元素的地址;] *初始化:int a[2]={1,2}(可省略size和和第一個元素后的元素);或 a[0]=1,a[1]=[2];

** 一維數(shù)組的元素作為函數(shù)實參,與同類型的簡單變量作為實參一樣,是單向的值傳遞,即數(shù)組元素的值傳給形參,形參的改變不影響實參; 但是,如果一維數(shù)組的名字作為函數(shù)實參,傳遞的是整個數(shù)組,即形參數(shù)組和實參數(shù)組完全等同,是存放在同一存儲空間的同一個數(shù)組。這樣形參數(shù)組修改時,實參數(shù)組也同時被修改了。形參數(shù)組的元素個數(shù)可以省略。 [* 此處同java *]

二維數(shù)組 是一個特殊的一維數(shù)組,元素是一個一維數(shù)組;存放的順序是一行行的存; a[0]、a[1]也是數(shù)組,是一維數(shù)組,而且a[0]、a[1]就是數(shù)組名,因此a[0]、a[1]就代表著這個一維數(shù)組的地址;a = a[0][0]; [若只初始化了部分元素,可省略行數(shù),但不能省略列數(shù);]

字符串 沒有String類型,使用字符數(shù)組來存儲字符串; ** 字符串可以看做是一個特殊的字符數(shù)組,為了跟普通的字符數(shù)組區(qū)分開來,應該在字符串的尾部添加了一個結束標志’/0’。’/0’是一個ASCII碼值為0的字符,是一個空操作符,表示什么也不干。所以采用字符數(shù)組存放字符串,賦值時應包含結束標志’/0’。 [NOTE:尾部有個’/0’,如果沒有這個結束標記,說明這個字符數(shù)組存儲的并不是字符串]

初始化:一般使用 char s[] =“mj”;會自動在末尾添加’/0’; 若使用char s[]={‘m’,’j’,’/0’};一定要加’/0’;否則會造成內存地址錯誤,內存泄露,讀到臟數(shù)據(jù); == puts(s)== 輸出字符串:會從起始地址一直打印到’/0’止,故若定義時沒有’/0’,則很可能會出現(xiàn)內存泄露(很危險) == gets(s)== 輸入字符串:從s的地址開始逐個賦值用戶輸入的字符,并自動加上/0,故兩個s一起打印,會讀到其他數(shù)據(jù)(很危險), (gets一次只能讀取一個字符串,scanf則可以同時讀取多個字符串; gets可以讀入包含空格、tab的字符串,直到遇到回車為止;scanf不能用來讀取空格、tab

+字符串數(shù)組 一維字符給存放一個字符串;

+字符串處理函數(shù) == putchar(‘A’)==:輸出一個char字符; == char c;c=getchar()==:輸入一個char字符; == strlen(s) ==:測量字符個數(shù),但不包括/0; == strcpy(s1,s2)==:將右邊的s2字符串拷貝到字符數(shù)組s1中。從s1的首地址開始,逐個字符拷貝,直到拷貝到/0為止。當然,在s1的尾部肯定會保留一個/0。[原s1中的內容會被清掉] == strcat(s1,s2)==:把s2拼接到s1的后面,從首地址開始到第一個’/0’就認為是字符串末尾,而不管后面是否還有內容如(char s[]={‘a(chǎn)’,’/0’,’b’})[但必須要保證s1有足夠的長度來存儲s2,否則會內存溢出。]; == strcmp(s1,s2)==:根據(jù)字符的ASCII碼的大小來比較兩個字符串的大小;大于為1,等于為0,小于為-1; == strlwr(s)==:將字符串中的大寫轉成小寫;

感謝李明杰老師@M了個J的講解及時詳細的課件(http://www.cnblogs.com/mjios)!

博客地址:IOS基礎學習之C(一)


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 拜城县| 黔西| 新巴尔虎左旗| 应城市| 鲜城| 锡林浩特市| 拉孜县| 上饶县| 富宁县| 新乐市| 饶河县| 信丰县| 莆田市| 肇源县| 晴隆县| 东兴市| 颍上县| 馆陶县| 娄底市| 遂昌县| 丽江市| 穆棱市| 会昌县| 永康市| 保靖县| 德保县| 惠州市| 宜川县| 新晃| 临泽县| 沙湾县| 河西区| 阜康市| 亚东县| 台南县| 巨野县| 吕梁市| 崇阳县| 威远县| 安顺市| 蚌埠市|