C語言學(xué)習(xí)筆記.docx_第1頁
C語言學(xué)習(xí)筆記.docx_第2頁
C語言學(xué)習(xí)筆記.docx_第3頁
C語言學(xué)習(xí)筆記.docx_第4頁
C語言學(xué)習(xí)筆記.docx_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

在VS2012中的主程序必須是帶有類型標(biāo)識符的,不然編譯不能通過。例如:#include main (void) printf(歡迎來到C語言世界!n)以上這個程序是編譯同步過的,要寫成如下:#include int main (void) printf(歡迎來到C語言世界!n)Visual Studio 2012 命令行上面編譯命令:cl /EHsc basic.cpp常量 整數(shù) 十進(jìn)制: 傳統(tǒng)寫法 十六進(jìn)制: 前面加0x或者0X 八進(jìn)制: 前面加0例一:# include int main(void) int m = 0256, n = 256; /0256為八進(jìn)制,256為十進(jìn)制 printf (%o %o n, m , n); return 0;輸出結(jié)果為:256 400 浮點(diǎn)數(shù) 字符書籍:林銳 高質(zhì)量C/C+編程機(jī)械工業(yè)出版社 Turbo C 2.0 實用大全進(jìn)制和printfprintf (%X) /十六進(jìn)制 大寫輸出,輸出格式為:十六進(jìn)制數(shù)字printf (%#X) /帶前綴的 十六進(jìn)制,輸出格式為:0x十六進(jìn)制數(shù)字int main(void) int m = 666, n = 888; printf (%dn, m , n); return 0;輸出結(jié)果是:666& 區(qū)地址符scanf用法1 _ 不含輸入控制符的用法# include int main (void) int i; scanf(%d, &i); prinf(i =%dn, i); return 0;scanf用法2 _ 含輸入控制符的用法# include int main (void) int i; scanf(m%d, &i); /檢測有m開頭輸入后數(shù)據(jù)才是合法輸入 如:123 非法 m123 輸出123 prinf(i =%dn, i); return 0;sacnf用法3 _ 一次給多個變量鍵盤賦值.swf# include int main (void) int i,j; scanf(%d %d, &i, &j); prinf(i =%d j = %dn, i, j); return 0;如何編寫高質(zhì)量的scanf 的代碼。1.在寫scanf代碼前最好用printf顯示提示信息。2.在寫scanf最好不要使用非輸入控制符,不要用/n。流程控制:(學(xué)習(xí)C語言的重點(diǎn)) 1.什么事流程控制 程序代碼執(zhí)行的順序 2.流程控制的分類 順序 選擇 循環(huán)if的簡單用法: # inclued int main(void) if(1) printf(AAAA/n); /會輸出AAAA if(0) printf(AAAA/n); /不會輸出AAAA一些常見的需要算法知識的C語言程序:判斷一個數(shù)字是否是素數(shù)判斷一個數(shù)字是否是回文數(shù)編程實現(xiàn)求一個十進(jìn)制數(shù)字的二進(jìn)制形式求一個數(shù)字的每位是奇數(shù)的數(shù)字取出來組合形成的新數(shù)字求一個數(shù)字倒過來的數(shù)字如何看懂一個程序,分三步:1. 流程2. 每個語句的功能3. 試數(shù)如何學(xué)習(xí)一些需要算法的程序【如何掌握一個程序】1.嘗試自己去編程解決它但要意識到大部分人都是自己無法解決的,這時不要?dú)怵H, 也不要自卑, 如果十五分鐘還想不出來, 此時我建議您就可以看答案了2.如果解決不了, 就看答案關(guān)鍵是把答案看懂, 這個要花很大的精力,也是我們學(xué)習(xí)的重點(diǎn),看懂一個程序要分三步: 流程、每個語句的功能、 試數(shù)3.看懂之后嘗試自己去修改程序,并且知道修改之后程序的輸出結(jié)果的含義不建議看懂程序之后就立即自己敲程序4.照著答案去敲5.調(diào)試錯誤6.不看答案,自己獨(dú)立把答案敲出來7.如果程序?qū)嵲跓o法徹底理解, 就把它背會,不過無法徹底理解的程序非常少, 我自己幾乎沒有碰到過數(shù)據(jù)類型的強(qiáng)制轉(zhuǎn)換:/* 功能:比較輸入數(shù)字的大小,并且進(jìn)行排序 目的: 掌握If的用法 時間:2013-1-31*/# include int main (void) int a, b, c; int t; /t 變量為轉(zhuǎn)換時候的中間變量 printf (請輸入第一個數(shù):); scanf (%d, &a); printf (請輸入第二個數(shù):); scanf (%d, &b); printf (請輸入第三個數(shù):); scanf (%d, &c); /比較三個數(shù)字的大小,a為最大,b為中間,c為最小。 /將 符號就可以將三個數(shù)字按照從小到的的順序進(jìn)行排列。 if (a b) t = a; a = b; b = t; if (a c) t = a; a = c; c = t; if (b bc-*/for的用法:/* 功能:求1+2+3+.+100的和 目的: for的簡單的用法 時間:2013年1月31日13:08:02*/# include int main(void) int i; int sum = 0; /定義此變量的時候一定要將定義的變量賦值為零, /不然定義的變的里面將是一個垃圾值,使計算的結(jié)果不正確。 for (i = 1; i = 100; +i) sum = sum + i; printf(1+2+3+.+100=%d, sum); return 0;注意:再學(xué)習(xí)了If和For命令之后,不要將for循環(huán)與if判斷命令混淆。 if是判斷指令,而for是循環(huán)指令/*功能:理解數(shù)據(jù)間進(jìn)行運(yùn)算是必要的類型轉(zhuǎn)換時間:2013年2月2日12:34:18*/# include int main (void)int i;float sum = 0;for (i = 1; i 回文數(shù)的理解: 擴(kuò)展:對一個整型數(shù)據(jù)進(jìn)行倒敘排列/*功能:判定一個從鍵盤輸入的數(shù)字是否是回文數(shù) 回文數(shù):順序?qū)懞偷箶懚际峭粋€數(shù)字。 如:121 212 因此判斷一個回文數(shù)即使將數(shù)字的順序進(jìn) 行倒敘排列后,判讀值是與輸入數(shù)相同。 同-則 是 不同-則 不是目的:掌握回文數(shù)的理解和方法的實現(xiàn),并進(jìn)一步 對數(shù)字的倒敘排列進(jìn)行理解。時間:2013年2月3日16:28:21*/# include int main(void) int i, j = 0; int val; /定義輸入待判斷的數(shù) int temp = 0; printf (請輸入一個數(shù)字: ); scanf (%d, &val); printf (n); i = val; /將輸入數(shù)字進(jìn)行倒敘排列,用于對比是否是回文數(shù) while (i) /此程序有多個parintf,用于詳細(xì)觀察程序的每一 /步執(zhí)行的結(jié)果而寫的輸出語句 printf (計算前val=%dn, val); printf (計算前i=%dn, i); printf (計算前temp=%dn, temp); temp = 10 * temp + i % 10; i /= 10; +j; /用于詳細(xì)觀察程序的每一步執(zhí)行的結(jié)果而寫的輸出語句 printf (第%d次計算后temp=%d i=%dnn, j, temp, i); /*試數(shù):1計算前val=123 /輸入值不變 計算前i=123 計算前temp=0 第1次計算后temp=3 / temp = 10 * temp + i % 10 i=12 / i /= 102計算前val=123 /輸入值不變 計算前i=12 計算前temp=3 第2次計算后temp=32 / temp = 10 * temp + i % 10 i=1 / i /= 103計算前val=123 /輸入值不變 計算前i=1 計算前temp=32 第3次計算后temp=321 / temp = 10 * temp + i % 10 i=0 / i /= 10 計算結(jié)果的temp值是: 321 */ /將已經(jīng)進(jìn)行倒敘排列輸入的數(shù)輸出 printf (計算結(jié)果的值是: %dnn, temp); /將輸入數(shù)與最終計算出的結(jié)果進(jìn)行對比,判斷是否是回文數(shù) if (val = temp) printf (%d是一個回文數(shù)!n, val); else printf (%d不一個回文數(shù)!n, val); printf (開始還原為輸入數(shù)n); /這段程序的目的是用for實現(xiàn)將計算出判斷是否為回文數(shù)的值還原為輸入數(shù)。 printf (n); i = temp; /清零 temp ,用于for 循環(huán)時的反向計算 j = 0; /清零 j 用于for循環(huán)時輸出準(zhǔn)確的計算次數(shù) for (temp = 0; i != 0; i /= 10 ) /此程序有多個parintf,用于詳細(xì)觀察程序的每一 /步執(zhí)行的結(jié)果而寫的輸出語句 printf (計算前val=%dn, val); printf (計算前i=%dn, i); temp = 10 * temp + i % 10; +j; /計算 for 循環(huán)運(yùn)行的次數(shù) printf (第%d次計算后temp=%d i=%dnn, j, temp, i); printf (計算結(jié)果的值是: %d, temp); return 0;/*總結(jié):輸入一個數(shù)能夠?qū)?shù)字經(jīng)過兩次運(yùn)算后重新還原成原來的數(shù)。如輸入:123 經(jīng)過 While 運(yùn)算后是 321 再經(jīng)過 for 運(yùn)算后是 123 */函數(shù)函數(shù)的調(diào)用必須匹配為什么需要函數(shù): 避免了寫重復(fù)性的代碼 有利于程序的模塊化什么叫函數(shù): 邏輯上:能夠完成特定功能的獨(dú)立代碼 物理上:能夠接受數(shù)據(jù)當(dāng)然也可以不接受數(shù)據(jù) 能夠?qū)邮軘?shù)據(jù)進(jìn)行處理 能將數(shù)據(jù)處理的結(jié)果進(jìn)行傳遞 總結(jié):函數(shù)是個工具,為了解決大量類似的問題而設(shè)計的 函數(shù)可以當(dāng)作是一個黑匣子。例子:int cont(void) /括號中的void表示該函數(shù)不能接收數(shù)據(jù) int表示函數(shù)會返回int類型的數(shù)據(jù) return 10;void cont(void) /函數(shù)名前面的void表示該函數(shù)沒有返回值 括號中的void表示該函數(shù)不能接收數(shù)據(jù)如何定義函數(shù): 格式: 函數(shù)的返回值 函數(shù)的名字(函數(shù)的形參列表) 函數(shù)執(zhí)行體 1.函數(shù)定義的本質(zhì)是詳細(xì)的描述函數(shù)之所以能夠?qū)崿F(xiàn)某個特定的功能 的具體方法。 2.return 表達(dá)式的含義: 1終止被調(diào)用函數(shù),向主函數(shù)返回表達(dá)式的值 2如果表達(dá)式為空,則只終止函數(shù),不向被調(diào) 用的函數(shù)返回任何值 3break是用來終止循環(huán)和switch,return是 用來終止函數(shù)。例子:void f() return; /終止函數(shù),不會向主函數(shù)返回任何值int f() return 10; /1.終止函數(shù) 2.向主函數(shù)返回10 3.函數(shù)的返回值的類型也稱為函數(shù)的類型,因為,如果函數(shù)名前的返回類 型和函數(shù)執(zhí)行的 return 表達(dá)式中的類型如果不同,則最終函數(shù)的返 回值的類型以函數(shù)前的返回值類型為準(zhǔn)。例子:# include /定義int類型的函數(shù) fint f()return 10.5;int main()double a;a = f();printf(%dn, a) /最終的輸出結(jié)果是:double類型的10,即 10.000000,說明 f 函數(shù)返回的值是將浮點(diǎn)型 的10.5強(qiáng)制輸出為 int 類型的10,而不是 10.5,因此說明當(dāng)函數(shù)的返回與函數(shù)的類型發(fā) 生沖突(矛盾)時,以函數(shù)類型為準(zhǔn),因此 在構(gòu)造(定義)函數(shù)時,應(yīng)避免此類發(fā)生。return 0;函數(shù)的分類:有參函數(shù) 和 無參函數(shù)有返回值函數(shù) 和 無返回值函數(shù)值傳遞函數(shù) 和 地址傳遞函數(shù)庫函數(shù) 和 用戶函數(shù)普通函數(shù) 和 主函數(shù)(mian函數(shù))一個程序必須有且只能有一個主函數(shù),主函數(shù)可以調(diào)用普通函數(shù),反之則不可以。普通函數(shù)可以互相調(diào)用。主函數(shù)是程序的入口也是出口。函數(shù)調(diào)用和定義: 1.順序:先定義后調(diào)用 2.如果函數(shù)調(diào)用寫在了函數(shù)的前面,就必須加前置聲明。 3.告訴編譯器即將可能出現(xiàn)的若干個的字母的組合所代表的是函數(shù)。 4.告訴編譯器函數(shù)的返回值和形參具體情況。 5.函數(shù)聲明是一個語句,末尾結(jié)束要加分號。如:int max(int a); 6.對庫函數(shù)的申明是通過“# include ”來實現(xiàn)的。形參和實參:形參和實參的個數(shù)必須相同。形參和實參的位置必須一一對應(yīng)。形參和實參的類型必須兼容。函數(shù)的合理的設(shè)計:在軟件開發(fā)中合理的設(shè)計函數(shù)來解決實際問題的時候,一個函數(shù)額功能盡量獨(dú)立,單一,多學(xué)習(xí),多模仿牛人的代碼。局部變量:在函數(shù)的內(nèi)部定義的變量或者是形參叫局部變量。全局變量:不是定義在函數(shù)的內(nèi)部的變量,即在程序定義了頭文件之后定義的變量,且全局變量所有的函數(shù)都可以不在聲明就直接使用,使用后如果為對變量進(jìn)行清空和重置操作,下次使用此變量的時候還未上次使用后的值。全局變量和局部變量沖突問題:# include int i = 99;int f(int i) printf(i = %d,i);int main(void) f(8);程序執(zhí)行結(jié)果是: i = 8在一個函數(shù)的內(nèi)部定義的變量與全局定義的變量命名的重復(fù)(一樣)的時候,局部變量會把全局變量屏蔽掉,最終的輸出是局部變量定義后或者是執(zhí)行的結(jié)果。注意:實參和形參永遠(yuǎn)不是同一個變量。指針:指針就是地址,地址就是指針地址就是內(nèi)存單元的編號指針變量是存放地址的變量指針和指針變量是兩個不同的概念但是要注意: 通常我們敘述時會把指針變量簡稱為指針,實際它們含義并不一樣例子程序:# include int main(void)int * p; /p是變量的名字, int * 表示p變量存放的是int類型變量的地址 /int * p; 不表示定義了一個名字叫做*p的變量 /int * p;應(yīng)該這樣理解: p是變量名,p變量的數(shù)據(jù)類型是int * 類 型,所謂int * 類型 實際就是存放int變量地址的類型 int i = 3;int j;p = &i;/*1. p保存了i的地址, 因此p指向i2. p不是i,i也不是p,更準(zhǔn)確的說: 修改p的值不影響i的 值,修改i的值也不會影響p的值3. 如果一個指針變量指向了某個普通變量, 則 *指針變量 就完全等同于 普通變量 例子:如果p是個指針變量,并且p存放了普通變量i的地址則p指向了普通變量i*p 就完全等同于 i或者說: 在所有出現(xiàn)*p的地方都可以替換成i在所有出現(xiàn)i的地方都可以替換成*p *p 就是以p的內(nèi)容為地址的變量*/j = *p; /等價于 j = i;printf(i = %d, j = %dn, i, j);return 0;指針的重要性:1.表示一些復(fù)雜的數(shù)據(jù)結(jié)構(gòu)2.快速的傳遞數(shù)據(jù)3.使函數(shù)返回一個以上的值4.能夠方便的處理字符串5.能直接訪問硬件6.是理解面向?qū)ο笳Z言的引用基礎(chǔ) 總結(jié):指針是C語言的靈魂指針的定義:地址:內(nèi)存單元的編號 從零開始的非負(fù)整數(shù) 范圍: 指針: 指針就是地址,地址就是指針 地址就是內(nèi)存單元的編號 指針變量是存放地址的變量 指針和指針變量是兩個不同的概念 但是要注意:通常我們敘述時會把指針變量簡稱為指針,實際它們含義并不一 指針的本質(zhì)就是一個操作受限的非負(fù)整數(shù)指針的分類:1.基本類型的指針 例子:int * p; /p是變量的名字, int * 表示p變量存放的是int類型變量的地址 /int * p; 不表示定義了一個名字叫做*p的變量 /int * p;應(yīng)該這樣理解: p是變量名,p變量的數(shù)據(jù)類型是int * 類 型,所謂int * 類型 實際就是存放int變量地址的類型 int i = 3; int j; p = &i;/*1. p保存了i的地址, 因此p指向i2. p不是i,i也不是p,更準(zhǔn)確的說: 修改p的值不影響i的 值,修改i的值也不會影響p的值3. 如果一個指針變量指向了某個普通變量, 則 *指針變量 就完全等同于 普通變量 例子:如果p是個指針變量,并且p存放了普通變量i的地址則p指向了普通變量i*p 就完全等同于 i或者說: 在所有出現(xiàn)*p的地方都可以替換成i在所有出現(xiàn)i的地方都可以替換成*p *p 就是以p的內(nèi)容為地址的變量*/j = *p; /等價于 j = i;printf(i = %d, j = %dn, i, j);2. 指針和數(shù)組: 指針和一維數(shù)組 數(shù)組名: 一維數(shù)組名是個指針常量 即 數(shù)組名是指針地址 它存放的時一維數(shù)組第一個元素的地址 例: int a9 printf(%#X, &a0) /數(shù)組a9的第一個元素的地址 printf(%#X, a) /數(shù)組a的內(nèi)容 /* 最終輸出結(jié)果相同,證明了一維數(shù)組名是個指針常量 即 數(shù)組名是指針地址 它存放的時一維數(shù)組第一個元素的地址 */ 因此在設(shè)計函數(shù)的時候,要對數(shù)組進(jìn)行操作或者要傳遞數(shù)組的內(nèi)容的時候, 調(diào)用或者是接受數(shù)組的數(shù)據(jù)的函數(shù)必須定義為指針類型的變量。 例:# include void OutArr();void Arr();int main(void)int a9 = 1, 2, 3, 4, 5, 6, 7, 8, 9int b9 = 9, 8, 7, 6, 5, 4, 3, 2, 1printf(%d,a3);Arr(a, 9)return 0; /Arr函數(shù)就任意輸出任意一個一維數(shù)組的內(nèi)容void OutArr(int * pArr, int len) /確定一個數(shù)組需要兩個 /參數(shù),首地址和數(shù)組的長度 int i;for(i = 0; i len; +i)printf(%d , pArri); / 被調(diào)用函數(shù)內(nèi)的 /*(pArr+i) 與 pArri等價 / 同樣也等價于調(diào)用函數(shù) /(主函數(shù))的 ai 和 *aireturn;void Arr(int * pArr, int * len)pArr3 = 88; return; 下標(biāo)和指針的關(guān)系: 如果p是個指針變量,則 pi 永遠(yuǎn)等價于*(p+i) 確定一個數(shù)組 即如果一個函數(shù)要處理一份一維數(shù)組,則需要接收該數(shù)組的哪些信息 數(shù)組名或是數(shù)組的首地址第一個元素的地址 數(shù)組長度 指針變量的運(yùn)算: 不能相加 不能相乘 不能相加 也不能相除 如果兩個指針變量指向的是同一連續(xù)空間中的不同存儲單元 則這兩個指針變量才可以相減 例:# include int main(void) int a = 9; int b = 10; int a4; int b5; int * p; int * q; p = &a; q = &b; printf(%d, p - q); /無意義 q = &a3; q = &b4; printf(%d, p - q); /無意義 q = &a3; q = &b4; printf(兩個數(shù)組之間間隔%d個單元, p - q); /有意義 return 0;一個指針變量到底占幾個字節(jié) 預(yù)備知識: sizeof(數(shù)據(jù)類型) 功能:返回值就是該 數(shù)據(jù)類型 所占的字節(jié)數(shù) 例子:sizeof(int) = 4 sizeof(char) = 1 sizeof(double) = 8 sizeof(變量名) 功能:返回值就是該 變量 所占的字節(jié)數(shù) 假設(shè) p指針 指向char類型變量(1個字節(jié)) 假設(shè) q指針 指向int類型變量(4個字節(jié)) 假設(shè) r指針 指向double 類型變量(8個字節(jié)) p q r 本身所占的字節(jié)數(shù)是否一樣 ? 答案:p q r 本身所占的字節(jié)數(shù)是一樣的 總結(jié):一個指針變量無論指向的變量占幾個字 節(jié),該指針變量都占4個字節(jié) 注意:一個變量的的地址使用的是該變量的首字節(jié)的地址 來表示 指針和二維數(shù)組專題: 動態(tài)內(nèi)存分配: 傳統(tǒng)數(shù)組的缺點(diǎn): 1.數(shù)組的長度必須事先制定,且正能是常整數(shù),不能是變量 例: int a5; /ok int len = 5; int a len; /

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論