五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

C/C++編程筆記:C語(yǔ)言編程知識(shí)要點(diǎn)總結(jié)!大一C語(yǔ)言知識(shí)點(diǎn)(全)

2020-07-07 23:18 作者:C語(yǔ)言編程__Plus  | 我要投稿



一、C語(yǔ)言程序的構(gòu)成

與C++、Java相比,C語(yǔ)言其實(shí)很簡(jiǎn)單,但卻非常重要。因?yàn)樗荂++、Java的基礎(chǔ)。不把C語(yǔ)言基礎(chǔ)打扎實(shí),很難成為程序員高手。

1、C語(yǔ)言的結(jié)構(gòu)

先通過一個(gè)簡(jiǎn)單的例子,把C語(yǔ)言的基礎(chǔ)打牢。


C語(yǔ)言的結(jié)構(gòu)要掌握以下幾點(diǎn):

(1)C語(yǔ)言的注釋是/* ··· */,而不是//···,//是C++的單行注釋,有的C語(yǔ)言版本也認(rèn)可。

(2)C語(yǔ)言區(qū)分大小寫,每句以分號(hào)結(jié)尾。

(3)C語(yǔ)言程序是從main函數(shù)開始的。函數(shù)的返回值如果缺省則為int,而不是void。

(4)函數(shù)必須用return來返回。即使void類型也不建議省略。

(5)使用函數(shù)時(shí)須包含相應(yīng)的頭文件。自定義的頭文件用雙引號(hào),C語(yǔ)言自身的頭文件用<···>


2、main()函數(shù)的寫法與含義

main()的參數(shù)和返回值全部省略,這和上例含義相同。省略寫法是一種很不好的習(xí)慣。


main()的參數(shù)是一種不限個(gè)數(shù)的寫法,argc代表參數(shù)的個(gè)數(shù),真正的參數(shù)是放在argv[]數(shù)組里面的。注意:當(dāng)數(shù)組當(dāng)參數(shù)用時(shí),數(shù)組被降格為指針。初學(xué)者先照著樣子寫,以后小雅會(huì)詳細(xì)說明指針和數(shù)組的區(qū)別。



3、頭文件的意義

每個(gè)C程序通常分為兩個(gè)文件。一個(gè)文件用于保存程序的聲明(declaration),稱為頭文件。另一個(gè)文件用于保存程序的實(shí)現(xiàn)(implementation),稱為定義(definition)文件。

C程序的頭文件以“.h”為后綴,C 程序的定義文件以“.c”為后綴。

頭文件的內(nèi)容也可以直接寫C程序中,但這是很不好的習(xí)慣。許多初學(xué)者用了頭文件,卻不明其理。在此略作說明。

(1)通過頭文件來調(diào)用庫(kù)功能。在很多場(chǎng)合,源代碼不便(或不準(zhǔn))向用戶公布,只要向用戶提供頭文件和二進(jìn)制的庫(kù)即可。用戶只需要按照頭文件中的接口聲明來調(diào)用庫(kù)功 能,而不必關(guān)心接口怎么實(shí)現(xiàn)的。編譯器會(huì)從庫(kù)中提取相應(yīng)的代碼。

(2)頭文件能加強(qiáng)類型安全檢查。如果某個(gè)接口被實(shí)現(xiàn)或被使用時(shí),其方式與頭文件中 的聲明不一致,編譯器就會(huì)指出錯(cuò)誤,這一簡(jiǎn)單的規(guī)則能大大減輕程序員調(diào)試、改錯(cuò)的 負(fù)擔(dān)。


關(guān)于頭文件的內(nèi)容,初學(xué)者還必須注意。

(1)頭文件中可以和C程序一樣引用其它頭文件,可以寫預(yù)處理塊,但不能寫語(yǔ)句命令。

(2)可以申明函數(shù),但不可以定義函數(shù)。

(3)可以申明常量,但不可以定義變量。

(4)可以“定義”一個(gè)宏函數(shù)。注意:宏函數(shù)很象函數(shù),但卻不是函數(shù)。其實(shí)還是一個(gè)申明。

(5)結(jié)構(gòu)的定義、自定義數(shù)據(jù)類型一般也放在頭文件中。

(6)#include <filename.h>,編譯系統(tǒng)會(huì)到C語(yǔ)言固定目錄去引用。#include "filename.h",系統(tǒng)一般首先在當(dāng)前目錄查找,然后再去環(huán)境指定目錄查找。

4、好的風(fēng)格是成功的關(guān)鍵

版本申明、函數(shù)功能說明、注釋等是C語(yǔ)言程序的一部分。不養(yǎng)成很好的習(xí)慣則不能成為C語(yǔ)言高手(專業(yè)人員)。



二、比較、邏輯、位運(yùn)算符

只有類型相同(或C語(yǔ)言能自動(dòng)轉(zhuǎn)換)的表達(dá)式才能比較,如果類型不同就必須用函數(shù)轉(zhuǎn)換。例如:判斷一字符串的長(zhǎng)度是否等于10,就要用strlen()將字符串的長(zhǎng)度求出來變成了整型,才能和10比較。

比較運(yùn)算符只有6個(gè),即:等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)。比較運(yùn)算符也叫關(guān)系運(yùn)算符。

邏輯運(yùn)算符只有3個(gè),即:與AND(&&)、或OR(||)、非NOT(!)。

位運(yùn)算符只有6個(gè),即:與AND(&)、或OR(|)、非NOT(~)、異或XOR(^)、左移ShiftLeft(<<)、右移ShiftRight(>>)。


三、數(shù)組

(1)數(shù)組名也是一變量名,定義時(shí)須指定類型和長(zhǎng)度。

(2)長(zhǎng)度可以方括號(hào)中直接指定,也可以通過賦值來間接指定。

(3)數(shù)組可以在定義時(shí)直接賦值,也可以定義時(shí)不賦值,之后再賦值。

(4)當(dāng)使用超出范圍的值時(shí),編譯不出錯(cuò),但運(yùn)行會(huì)出錯(cuò)。(上例運(yùn)行時(shí)出錯(cuò)后,選“忽略”后得到的結(jié)果)

數(shù)組的地址

弄清數(shù)組地址對(duì)使用數(shù)組有很大好處,另外,有的函數(shù)的參數(shù)是指針(如scanf函數(shù)),如果要用數(shù)組的某一元素作參數(shù),就必須知道其地址。


1.數(shù)組iArr是int類型,所以它的地址是按4字節(jié)遞增。

2.數(shù)組cArr是char類型,所以它的地址是按1字節(jié)遞增。

3.數(shù)組元素的地址是通過數(shù)組元素前面加“&”來取得。(如:&iArr[3])

4.數(shù)組名單獨(dú)使用時(shí),代表該數(shù)組的首地址。(iArr等同于&iArr[0])(注意:以后使用指針會(huì)經(jīng)常用到這一點(diǎn))


四、字符數(shù)組和字符串的重定義

字符數(shù)組就是字符串嗎?有人說是,因?yàn)闀线@么寫,教師也這么教的。小雅不敢說書上或教師們錯(cuò)了,但至少可以說許多初學(xué)者都混淆了這兩個(gè)概念。因此,在這此將這2個(gè)概念再明確一下。

1.字符數(shù)組,完整地說叫字符類型的數(shù)組。字符數(shù)組不一定是字符串。

2.字符串是最后一個(gè)字符為NULL字符的字符數(shù)組。字符串一定是字符數(shù)組。

3.字符數(shù)組的長(zhǎng)度是固定的,其中的任何一個(gè)字符都可以為NULL字符。

4.字符串只能以NULL結(jié)尾,其后的字符便不屬于該字符串。

5.strlen()等字符串函數(shù)對(duì)字符串完全適用,對(duì)不是字符串的字符數(shù)組不適用。


從上面例子看來,還要注意以下幾點(diǎn):

(1)char sArr[] = "quanxue";這種方式,編譯時(shí)會(huì)自動(dòng)在末尾增加一個(gè)NULL字符。

(2)NULL字符也就是'\0',在ASCII表中排在第一個(gè),用16進(jìn)制表示為0x00。

(3)sizeof()運(yùn)算符求的是字符數(shù)組的長(zhǎng)度,而不是字符串長(zhǎng)度。

(4)strlen()函數(shù)求的是字符串長(zhǎng)度,而不是字符數(shù)組。它不適用于字符串以外的類型。

(5)char sArr[] = "quanxue";也可以寫成char sArr[8] = "quanxue";(注意:是8而不是7)

字符數(shù)組和字符串?dāng)?shù)組的轉(zhuǎn)化

字符數(shù)組中插入一個(gè)NULL字符,NULL字符前面(包括NULL字符)就成了字符串,一般NULL字符插在有效字符的最后。


數(shù)組的輸入輸出『gets(),puts()』

getchar()和putchar()函數(shù)是單個(gè)字符的輸入輸出,gets()和puts()是字符串的輸入輸出,也是標(biāo)準(zhǔn)函數(shù),在stdio.h中被定義。


五、指針

指針符號(hào)『*』和地址符號(hào)『&』

『&』符號(hào)是取變量的地址,『*』符號(hào)是取地址的內(nèi)容(即:值)。兩個(gè)操作正好相反。例如:“&i”就是取變量i的地址,“*(&i)”就是取“&i”這個(gè)地址的值,其實(shí)就是變量i。即然如此,為什么還要定義指針呢?原來,用『&』所取到的地址,自身只能用而不能修改。因此,直接把『&』取到的地址放到指針變量中去,既然指針變量也是變量,這個(gè)變量就可以任意存放其它地址。


指針變量的賦值和指針的賦值

上例中p是指針變量,*p是p的指針,p存放的是某個(gè)變量的地址,*p存放的是某個(gè)變量的值。當(dāng)*p的內(nèi)容改變時(shí),p所指的變量的內(nèi)容也發(fā)生改變,因?yàn)槭峭粋€(gè)地址的存貯單元的值發(fā)生改變。同理,當(dāng)p所指的變量的值發(fā)生改變時(shí),*p的內(nèi)容也隨之改變。


被初始化的是指針變量還是指針

上面2例,指針變量都是用的p,初學(xué)者不要認(rèn)為只能用p,既然是變量,只要不違反命名規(guī)則都可以。當(dāng)指針變量被定義時(shí)立即賦值,這時(shí)被賦值的是指針變量還是指針呢?下面這段程序請(qǐng)大家千萬注意!


(1)charstr[] ="http://www.quanxue.cn/";中str是數(shù)組變量,當(dāng)?shù)刂焚x給point之后,point[11]就是str[11],所以其內(nèi)容可以改變。

(2)char*ptr ="http://www.51minge.com/";中賦值的性質(zhì)和上面的str不同。這并不是將"http://www.51minge.com/"賦給*ptr指針,而是先定義一個(gè)常量"http://www.51minge.com/",這個(gè)常量是定義在“?!崩锩?,然后將這個(gè)常量的地址賦給ptr,而不是*ptr。常量是不能被修改的,因此ptr[13]也就出錯(cuò)了。這是初學(xué)者經(jīng)常犯的錯(cuò)誤。


不賦值的指針和NULL

未賦值的指針變量是不能被使用的,其地址指向未不能使用的空間。建議定義時(shí)如果暫不使用,先賦NULL。為一個(gè)指針申請(qǐng)空間時(shí),一定義要判斷其是否為空,因?yàn)榉峙鋬?nèi)存失敗時(shí)返回NULL。不僅如此,甚至在使用指針時(shí)都應(yīng)該判斷一下是否為空。



六、指針、數(shù)組和字符串

一、數(shù)組和指針的關(guān)系

下面仍然是初學(xué)者容易搞錯(cuò)的地方。指針變量加n或減n,并不是地址加n或減n,而是當(dāng)前所指的地址向后或向前跳n次所指的地址。



二、指針數(shù)組

char型的指針數(shù)組相當(dāng)于二維字符數(shù)組,并不等于說指針數(shù)組可以直接轉(zhuǎn)化為二為字符數(shù)組,相反字符數(shù)組可以直接轉(zhuǎn)化為指針數(shù)組。因?yàn)槎S字符數(shù)組的地址是連續(xù)的,而指針數(shù)組所指的元素不一定連續(xù)(如下的m1、m2、m3的地址可以不連續(xù),長(zhǎng)度也可以不一樣)。


三、指向指針的指針

在第一章講main()函數(shù)的參數(shù)時(shí),已經(jīng)見過指針的指針,這和指針數(shù)組有相同的作用,但還是有細(xì)小的區(qū)別。指針數(shù)組可以在定義時(shí)直接初始化,而指向指針的指針不行。正如二維數(shù)組一樣,不指定第二維長(zhǎng)度不能直接初始化一樣。即不能char str[][]={"...", "...", ...}


四、指針的長(zhǎng)度

讓許多初學(xué)者遺憾的是,C語(yǔ)言沒有提供數(shù)組長(zhǎng)度的函數(shù),但可以用sizeof()運(yùn)算符先求數(shù)組的總長(zhǎng)度,再求出數(shù)組類型的長(zhǎng)度,二者相除便得到數(shù)組的長(zhǎng)度。C語(yǔ)言更大的一個(gè)遺憾便是,sizeof()對(duì)指針變量求值時(shí),結(jié)果總是4,這是因?yàn)橹羔樧兞康膬?nèi)容是地址,地址總是4個(gè)字節(jié)來表示。

因此有經(jīng)驗(yàn)的編程人員,在用指針作參數(shù)時(shí),一般總是同時(shí)多定義一個(gè)參數(shù),來存放其長(zhǎng)度。也就是指針和其長(zhǎng)度同時(shí)傳遞過去。另外,數(shù)組長(zhǎng)度如果事先知道,一般定義為常量。



七、為指針動(dòng)態(tài)分配內(nèi)存

C語(yǔ)言程序員要嚴(yán)防內(nèi)存泄漏,這個(gè)“內(nèi)存泄漏”就是由動(dòng)態(tài)內(nèi)存分配引起的。指針是C語(yǔ)言和其它語(yǔ)言的最大區(qū)別,也是很多人不能跨入C語(yǔ)言的一道門檻。既然指針是這么一個(gè)“危險(xiǎn)”的壞東西,干嗎不取消它呢?

其實(shí)指針本身并沒有好壞,它只是一種操作地址的方法,學(xué)會(huì)了便可以發(fā)揮其它語(yǔ)言難以匹敵的功能,沒學(xué)會(huì)的話,只能做其它語(yǔ)言的程序員,也同樣發(fā)揮你的光和熱。小雅本人也在C語(yǔ)言門外徘徊多年,至今仍屬于初學(xué)者。

一、變量和數(shù)組可以通過指針來轉(zhuǎn)換

“int*x”中的x究竟是不是數(shù)組?光看這一句小雅無法告訴你,因?yàn)樗瓤杀硎締蝹€(gè)變量?jī)?nèi)容,也可表示數(shù)組。下面是小雅專門為你準(zhǔn)備的例子,理解之后,對(duì)動(dòng)態(tài)分配時(shí)長(zhǎng)度計(jì)算有好處。


前面講到的指針,基本上將已經(jīng)定義好的變量的地址賦給指針變量,現(xiàn)在要學(xué)的是向操作系統(tǒng)申請(qǐng)一塊新的內(nèi)存。申請(qǐng)到的內(nèi)存,必須在某個(gè)地方手動(dòng)釋放,因此下面2個(gè)函數(shù)必須配對(duì)使用。malloc()和free(),都是標(biāo)準(zhǔn)函數(shù),在stdlib.h中定義。

根據(jù)不同的電腦使用狀況,申請(qǐng)內(nèi)存有可能失敗,失敗時(shí)返回NULL,因此,動(dòng)態(tài)申請(qǐng)內(nèi)存時(shí),一定要判斷結(jié)果是否為空。malloc()的返回值類型是“void *”,因此,不要忘記類型轉(zhuǎn)換。(許多人都省略了。)


三、隱蔽的內(nèi)存泄漏

內(nèi)存泄漏主要有以下幾種情況:

(1)內(nèi)存分配未成功,卻使用了它。

(2)內(nèi)存分配雖然成功,但是尚未初始化就引用它。

(3)內(nèi)存分配成功并且已經(jīng)初始化,但操作越過了內(nèi)存的邊界。

(4)忘記了釋放內(nèi)存,造成內(nèi)存泄露。

(5)釋放了內(nèi)存卻繼續(xù)使用它。

下面的程序造成內(nèi)存泄漏,想想錯(cuò)在何處?如何修改?


四、對(duì)動(dòng)態(tài)內(nèi)存的錯(cuò)誤觀念

有人對(duì)某一只在函數(shù)內(nèi)使用的指針動(dòng)態(tài)分配了內(nèi)存,用完后不釋放。其理由是:函數(shù)運(yùn)行結(jié)束后,函數(shù)內(nèi)的所有變量全部消亡。這是錯(cuò)誤的。動(dòng)態(tài)分配的內(nèi)存是在“堆”里定義,并不隨函數(shù)結(jié)束而消亡。

有人對(duì)某動(dòng)態(tài)分配了內(nèi)存的指針,用完后直接設(shè)置為NULL。其理由是:已經(jīng)為NULL了,這就釋放了。這也是錯(cuò)誤的。指針可以任意賦值,而內(nèi)存并沒有釋放;相反,內(nèi)存釋放后,指針也并不為NULL。


八、return和exit、assert的區(qū)別

return語(yǔ)句是結(jié)束當(dāng)前函數(shù)。而exit是結(jié)束main()函數(shù),即整個(gè)程序,一般都是在遇到非常錯(cuò)誤時(shí)才調(diào)用exit()。assert()是一個(gè)宏定義,在assert.h中申明,用來在DEBUG方式診斷程序,當(dāng)參數(shù)中的條件不成立時(shí),中斷main()函數(shù)。建議多多使用assert()。


九、變量和函數(shù)

在函數(shù)之外定義的變量是全局變量,在函數(shù)內(nèi)定義的變量是這個(gè)函數(shù)的局部變量。局部就是只能在當(dāng)前函數(shù)內(nèi)使用,而全局變量可以在任何一個(gè)函數(shù)中使用。

注意:一般而言,全局變量總是在所有函數(shù)之前定義,但如果某全局變量定義在兩個(gè)函數(shù)之間,則定義處后面的函數(shù)可以使用,而其前面函數(shù)不能使用。

有人說靜態(tài)變量相當(dāng)于全局變量,這句話其實(shí)不對(duì)。全局變量變成靜態(tài),就失去了靜態(tài)的意義,因此,靜態(tài)一般是加在局部變量上的。那么,究竟什么是靜態(tài)的局部變量呢?靜態(tài)變量隨函數(shù)的定義而定義,如果已經(jīng)存在就延用,但并不隨函數(shù)的結(jié)束而消亡。在某一函數(shù)中定義的靜態(tài)局部變量,不能在其它函數(shù)使用。

當(dāng)很多人編寫同一程序時(shí),一般程序會(huì)被分割成幾個(gè)文件。當(dāng)幾個(gè)人都定義了某一全局變量時(shí),編譯時(shí)不出錯(cuò),Link時(shí)將出錯(cuò)。解決這個(gè)問題的辦法:將其中一個(gè)定義原封不動(dòng),其余的定義前加上extend(即外部的定義)。

剛才所說是許多書上說的,小雅做了n次試驗(yàn),證明上述編譯時(shí)也不錯(cuò),Link時(shí)也不錯(cuò),也就是說extend完全是多余的。大概上面所說是幾十年前的版本吧。事實(shí)上與extend同列在一起的還有auto、regist等變量修飾符。auto是區(qū)別B語(yǔ)言的,早就沒用了,regist是將變量放到寄存器來運(yùn)算,小雅認(rèn)為基本沒有這種需要。

拆成多個(gè)文件,多次定義全局變量時(shí)要注意:

(1)變量的數(shù)據(jù)類型要一致。

(2)有長(zhǎng)度的數(shù)組和沒定義長(zhǎng)度的數(shù)組可以視為同一數(shù)據(jù)類型。

(3)數(shù)組和指針不能視為同一數(shù)據(jù)類型。

文章就分享到這里了,希望對(duì)大家有幫助!

原文鏈接:https://www.cnblogs.com/lisuyun/p/3974066.html

學(xué)習(xí)C/C++編程知識(shí),提升C/C++編程能力,歡迎關(guān)注UP一起來成長(zhǎng)!
另外,UP在主頁(yè)上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~

C/C++編程筆記:C語(yǔ)言編程知識(shí)要點(diǎn)總結(jié)!大一C語(yǔ)言知識(shí)點(diǎn)(全)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
宝鸡市| 民丰县| 子长县| 新建县| 大田县| 美姑县| 云龙县| 三台县| 大姚县| 毕节市| 封开县| 石景山区| 兴山县| 汶上县| 商河县| 隆子县| 天峨县| 新密市| 辽阳市| 玉屏| 东源县| 新野县| 佳木斯市| 临邑县| 桑植县| 昌图县| 平罗县| 炎陵县| 西乌珠穆沁旗| 遵义县| 农安县| 祥云县| 灵寿县| 丰台区| 长春市| 神木县| 岳西县| 临漳县| 烟台市| 阜城县| 南靖县|