c編程老師程序指針_第1頁
c編程老師程序指針_第2頁
c編程老師程序指針_第3頁
c編程老師程序指針_第4頁
c編程老師程序指針_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、本章主要內(nèi)容:指針的定義及初始化指針的指針指針的運算指針與數(shù)組指針數(shù)組和數(shù)組指針指針與字符串指針與函數(shù)1.1指針的概述指針是語言中廣泛使用的一種數(shù)據(jù)類型。運用指針編程是 C 語言最主要的風(fēng)格之一。利用指針變量可以表示多種數(shù)據(jù)結(jié)構(gòu),能方便地使用數(shù)組和字符串,并能像匯編一樣處理內(nèi)存地址。正因為它的靈活多變,初學(xué)者往往會感到很困惑。通過本章的學(xué)習(xí),針。利用指針編寫程序,跟數(shù)組結(jié)合使用等等。要玩轉(zhuǎn)指1.2地址與指針在計算機中,所有的數(shù)據(jù)都是存放在器中的,一般把器的一個字節(jié)稱為一個內(nèi)存單元。不同的數(shù)據(jù)類型占用的內(nèi)存單元是不同的。為了快速、準(zhǔn)確的這些內(nèi)存單元,計算機為每一個內(nèi)存單元進行這個地址叫做指針。,

2、內(nèi)存單元的也就是內(nèi)存單元的地址。C 語言中,把1.3指針的定義指針是一種數(shù)據(jù)類型,基于該類型的變量稱為指針變量,該變量存放的是內(nèi)存中的某個地址,和普通的變量一樣,在使用指針變量之前應(yīng)先對指針變量進行:類型 * 指針變量名;/如*um;“*”表示語句的是一個指針變量,類型指定了指針?biāo)傅膬?nèi)存單元的數(shù)據(jù)類型??梢詫?理解成一種復(fù)合類型,是指向型數(shù)據(jù)的指針。應(yīng)當(dāng)注意,下面的語句:*um1,um2;了一個指針(um1)和一個型變量(um2),在多個指針時,每個指針變量名前都要加*,*um1,*um2;便了兩個指針變量。通過 sizeof 可以計算出指針變量所占用的內(nèi)存單元始終是 4 個字節(jié)。也就是說任

3、何類型的指針變量都只占用 4 個字節(jié)的內(nèi)存空間。如:*pi;char *pch;double *pf;(參見代碼 Example1)則:sizeof(pi)=sizeof(pch)=sizeof(pf)=4另外,修改指針變量的值并不會影響到指針?biāo)赶虻淖兞康闹?。如:i = 8;j = 9;*pi = &i; pi = &j; i 的值始終是 8 沒有改變。1.4初始化指針指針變量時,C 并不會自動對其進行初始化,這時,指針變量的值是隨機的,在內(nèi)存中亂指一氣,此時,通過指針間接所指的內(nèi)存區(qū)域是十分的,因為你完全不知道段,實際上,可以在聲自己在做些什么。通過取地址符(&)給指針變量賦值是個有效明一

4、個指針變量的同時完成其初始化。num=1;*=#型變量的指針,并用 num 在內(nèi)存中的地址對其賦值。上述語句了一個指向在使用指針前,一般要對其進行初始化(在的同時初始化或賦值),使其有一個確定合適的值,對于無處可指的指針變量,也要將其初始化為 NULL(即 0,空指針)。如:*pa = NULL;1.5指針的指針指針變量也是變量,占據(jù)一定的內(nèi)存空間,有地址,因此可以用一個指針指向它,這稱為指向指針的指針,或二級指針。可已通過“*”一個二級指針,如double num;double*=#double* p=&;上面的指針可以看成指向 double*變量類型的指針,若有需要,還可以

5、定義三級、甚至更高級的指針。1.6指針之間相互賦值C 允許同類型的指針間的賦值,如圖 4.2 所示,1 和2 是兩個相同類型的指針,執(zhí)行“2=1;”這樣一個賦值操作后,1 和2 指向同樣的地址,也就是說,兩個指針指向同一個內(nèi)存單元,對*2 的任何改動都會影響*1 的值,反之亦然(參見代碼 Example2)1.7指針的運算C 語言中指針?biāo)苓M行的運算是十分有限的,通常有以下幾種:指針與整數(shù)的加減(包括指針的自增和自減)、同類型指針間的比較、同類型的指針相減。指針與整數(shù)的加減:指針與整數(shù)的加減表示指針在內(nèi)存中向下或向上移動整數(shù)個。該是多少個內(nèi)存字節(jié)取決于指針?biāo)缸兞康念愋?。如:short 類型的

6、每次移動 2 個字節(jié), double 類型的每次移動 8 個字節(jié)。將指針變量+1,其地址增加的值等于所指向的類型占用的內(nèi)存字節(jié)數(shù)。公式:指針變量新值=指針變量當(dāng)前值+N*指針?biāo)割愋驼加玫膬?nèi)存字節(jié)數(shù)。(參見代碼 Example3)同類型指針的比較:兩個指針的比較是兩個指針保存的地址數(shù)值大小的比較,如:p1的值為 0 x12345678,p2 的值為 0 x12345679,則 p1p2。同類型的指針相減:兩個相同類型指針相減,返回值是個整數(shù),其值為:(指針 1 的值-指針 2 的值)/ 指針?biāo)赶蜃兞康念愋退純?nèi)存字節(jié)數(shù)。(參見代碼 Example4)1.8指針與數(shù)組指針與一維數(shù)組:在 C 語

7、言中,指針和數(shù)組的關(guān)系非常密切,其原因在于凡是能用數(shù)組下標(biāo)完成的操作都可以用指針來實現(xiàn)??梢酝ㄟ^數(shù)組的下標(biāo)唯一確定數(shù)組中的某個元素,這種方式稱為下標(biāo)法。由于數(shù)組的每個元素都相當(dāng)于一個相應(yīng)類型的變量,指針變量可以指向一般的變量,當(dāng)然也可以指向數(shù)組中的元素。而且數(shù)組中的各個元素是按順序連續(xù)的存放在內(nèi)存中,因此,只要知道一個數(shù)組的首地址(即第一個元素的地址),然后依次往下移動,就能找到該數(shù)組的所有元素。(參見代碼 Example5)C 語言中,獲取數(shù)組首地址的方法有兩種:第一個元素的地址:p = &a0;數(shù)組名,數(shù)組名也代表數(shù)組的首地址:p = a;P 指向數(shù)組的首地址之后,p+1 表示數(shù)組元素 a

8、1的地址,p+i 表示數(shù)組元素 ai的地址,因此可以通過*(p+i)來數(shù)組元素 ai;這種方法叫指針法。假設(shè):a10 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;*p = a;那么獲得數(shù)組下標(biāo)為 i 的元素的地址:a+ip+i&ai&pi數(shù)組下標(biāo)為 i 的元素:ai*(a+i)pi*(p+i):數(shù)組名和指針變量本身并不完全等同,數(shù)組名代表的是一個地址常量,是數(shù)組的首地址,是不能改變的,而指針變量的值是可以改變的,它可以指向數(shù)組的任意一個元素的地址。因此語句 p+; +p; p+=5;等等都是合法的,而 a+; +a; a+=5;等都是碼 Example6)指針與二維數(shù)組:的

9、。(參見代在 C 語言中,二維數(shù)組是按照行優(yōu)先的規(guī)律轉(zhuǎn)換成一維數(shù)組存放在內(nèi)存中。例如:a43;如圖:*p = &a00;或*p = a0則二維數(shù)組在內(nèi)存中的順序及地址關(guān)系a 表示二維數(shù)組的首地址,a0表示第 0 行元素的首地址,a1表示第 1 行元素的首地址,a2表示第二行元素的首地址,a3表示第 3 行元素的首地址。由此歸納:a+i:二維數(shù)組第 i 行的首地址。 ai*(a+i):二維數(shù)組第 i 行第 0 列的地址。&ai0 或 ai + 0*(a+i)+j:二維數(shù)組第 i 行第 j 列的地址 &aij 或 ai + j*(*(a+i):二維數(shù)組第 i 行第 0 列的值。ai0或 *(ai+

10、0)*(*(a+i) + j):二維數(shù)組第 i 行第j 列的值。aij或 *(ai + j)由 ai*(a+i) 可以將二維數(shù)組進行轉(zhuǎn)換,將數(shù)組的一個 拆開就是 aij (*(a+i)j*(*(a+i) +j)如果一個指針*p = a0.則可以通過*(p + (i*每行列數(shù)+j)獲得第 i 行、第 j 列的值(即 aij),這可以根據(jù)上面的對照(參見代碼 Example7)表得出。1.9數(shù)組指針與指針數(shù)組數(shù)組指針:指向由 n 個元素組成的一維數(shù)組的指針。(趨向于指針)定義格式:數(shù)據(jù)類型 (*指針變量)n; ()不能缺少。n 必須與二維數(shù)組 aij的 j 相同。賦值方式:a34;(*p)4;p

11、= a; 或(*p)4 = a;定義的時候初始化。數(shù)組指針通常和二維數(shù)組名等價。方式:pij或*(p+i)j或 *(*(p+i) + j)指針數(shù)組:數(shù)組的每一個元素都是一個指針變量。(趨向于數(shù)組)定義格式:數(shù)據(jù)類型 *數(shù)組名n; 所有元素都必須是同種類型和指向相同數(shù)據(jù)類型。賦值方式:a34;*pb3 = a0, a1, a2; 指針數(shù)組通常和指針的指針等價。方式:pij或*(p+i)j或 *(*(p+i) + j)指針數(shù)組主要用于處理若干個字符串。如:char * name = “Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “F

12、riday”, “Saturday”;這樣 name0就指向”Sunday”(參見代碼 Example8)1.10指針與字符串C 語言一個字符串有兩種方式:字符數(shù)組、字符指針。char str = “how are you?”;char *pStr = “how are you?”;其中后者為文字常量區(qū),內(nèi)容不能被修改。1.11指針常量和常量指針i = 1;j = 2;/指針常量(即指針指向的內(nèi)容是常量,不能被修改)const*pa = &i;/const 放在指針之前,作用?保護指針指向的內(nèi)存塊不能被修改*pa = 7; /pa = &j; /合法/常量指針(指針本身是常量,不能再指向其它的地址)* const pb = &i;/const 放在指針之后,*pb = 7; /合法 pb = &j; /如果是下面這種情況:作用?保護指針變量對應(yīng)的內(nèi)存塊不能改變const* const pa

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論