




已閱讀5頁,還剩65頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
14.1 概述,14.2 指針和變量,14.3 指針變量的定義、初始化和引用,14.4 指針變量的使用,單元14 指針(一),一、概 述,指針是一種數(shù)據(jù)類型。所謂指針,就是指存放數(shù)據(jù)的內(nèi)存 地址。指針變量是一種變量,該變量中存放的數(shù)據(jù)就是指針類 型的數(shù)據(jù)。對一個(gè)變量或數(shù)組元素來說,可以通過變量名或數(shù) 組名下標(biāo)來引用,也可以通過指針變量來引用,但需要事先 將指針變量“指向”變量或數(shù)組,所謂“指向”就是將變量或數(shù)組 的地址存放到指針變量中。,返回,本單元在介紹指針和指針變量的基礎(chǔ)上,著重介紹指 向普通變量、字符串、數(shù)組的指針變量的定義和賦值的方 法,以及如何使用指針變量來引用對應(yīng)的變量、字符串和 數(shù)組元素的方法。最后簡要介紹指針類型數(shù)組和多級指針 的定義和使用。,二、指針和變量,(一)、指針,1、內(nèi)存單元和地址 內(nèi)部存儲器是由多個(gè)內(nèi)存單元組成的,每個(gè)內(nèi)存單元都 有自己獨(dú)有的地址,稱為內(nèi)存單元地址。,2、變量與地址,程序中可以用變量來存放各種數(shù)據(jù),因此每個(gè)變量都需要 分配連續(xù)的內(nèi)存單元。由于數(shù)據(jù)類型的不同,每個(gè)變量需要分 配的內(nèi)存單元數(shù)目也不同。例如,字符型變量需要占用1個(gè)內(nèi)存 單元;短整型變量需要占用連續(xù)的2個(gè)內(nèi)存單元;單精度變量 需要占用連續(xù)的4個(gè)內(nèi)存單元;雙精度變量需要占用連續(xù)的8 個(gè)內(nèi)存單元。,返回,當(dāng)一個(gè)變量只占用一個(gè)內(nèi)存單元時(shí),內(nèi)存單元的地址就是 變量的地址;當(dāng)變量占用連續(xù)的若干個(gè)內(nèi)存單元時(shí),最前面一 個(gè)單元的地址就是該變量的地址。,例如,有一條定義語句“int i3,j=5;float f;”,給它分配的內(nèi)存 單元如圖1所示,而記錄下來的變量與地址對照表如圖2所示。,3,5,2001,2002,2003,2004,2005,2006,2007,2008,整型變量i,整型變量j,單精度變量f,變量與地址對照表,圖1,圖2,通過變量名查取變量的地址,再從變量對應(yīng)地址的內(nèi)存 單元中取得值或?qū)⒛持荡嫒胱兞繉?yīng)地址的內(nèi)存單元中稱為 直接存取方式。,3、數(shù)組與地址,對一個(gè)數(shù)組來說所分配的內(nèi)存單元必須是連續(xù)的并且是 按順序?qū)?yīng)數(shù)組元素的。每個(gè)數(shù)組元素也要占用連續(xù)的內(nèi)存 單元。數(shù)組類型不同,每個(gè)數(shù)組元素占用的內(nèi)存單元數(shù)也不 同。數(shù)組占用的總單元數(shù)等于數(shù)組長度每個(gè)數(shù)組元素占用 的內(nèi)存單元數(shù)。,當(dāng)一個(gè)數(shù)組元素只占用一個(gè)內(nèi)存單元時(shí),內(nèi)存單元的地 址就是該數(shù)組元素的地址;當(dāng)數(shù)組元素占用若干個(gè)連續(xù)的內(nèi) 存單元時(shí),最前面一個(gè)單元的地址就是該數(shù)組元素的地址。 當(dāng)一個(gè)數(shù)組占用連續(xù)的若干個(gè)內(nèi)存單元時(shí),最前面的單元地 址稱為數(shù)組的首地址,也是第一個(gè)數(shù)組元素的地址。,每個(gè)數(shù)組元素的地址可以通過下列公式求得: 數(shù)組元素ai的地址數(shù)組首地址i數(shù)組元素的數(shù)據(jù)類型 所占用單元數(shù),對源程序進(jìn)行編譯時(shí),每遇到一個(gè)數(shù)組,按其類型和長 度分配內(nèi)存單元,同時(shí)記錄數(shù)組名、數(shù)據(jù)類型、數(shù)組長度、 數(shù)組首地址。例如有一條定義語句“int a3=1,2,3;”,給它 分配的內(nèi)存單元如圖3所示,而記錄下來的數(shù)組與地址對照 表如圖4所示。,1,2,3,3000,3001,3002,3003,3004,3005,地址,內(nèi)存單元,整型數(shù)組元素a0,整型數(shù)組元素a1,整型數(shù)組元素a2,圖 3,數(shù)組與地址對照表,圖4,(二)、指針變量,由于存放地址的變量像一個(gè)指針,指向要存取值的 變量,所以將這種變量稱為“指針變量”。由于地址是一 種特殊的數(shù)據(jù)類型,所以存放地址的指針變量和存放字 符型、整型、實(shí)型數(shù)據(jù)的變量是不同類型的變量。,我們來看看如何使用指針變量,通過間接存取方式來 完成賦值語句“a1=i*j;”操作的。事先將變量i、j和數(shù)組元 素a1的地址分別存入指針變量pi、pj、p。操作過程是: 先從指針變量pi中取出i的地址,再從該地址中取出變量i的 值;按同樣方法取出j的值進(jìn)行相乘;再從指針變量p中取 出數(shù)組元素a1的地址,將運(yùn)算結(jié)果存入該地址中。,C語言規(guī)定:, 變量地址只能利用運(yùn)算符通過運(yùn)算來獲得。這個(gè)運(yùn)算符是 “&”,稱為“取地址”運(yùn)算符,運(yùn)算對象是變量或數(shù)組元素名, 運(yùn)算結(jié)果是對應(yīng)變量或數(shù)組元素的地址。例如變量i的地址應(yīng) 寫成表達(dá)式“&i”,數(shù)組元素a1的地址應(yīng)寫成表達(dá)式“&a1”。, 數(shù)組的首地址就是數(shù)組名,不必利用取地址運(yùn)算符通過運(yùn) 算來獲得。例如定義了數(shù)組a,這個(gè)a在程序中是可以直接使 用的,它代表該數(shù)組的首地址,也是數(shù)組元素a0的地址。所 以“a”和“&a0”的作用是相同的。,三、指針變量的定義、初始化和引用,(一)、指針變量的定義和初始化,存儲類型 數(shù)據(jù)類型 指針變量名1=初值1,;,2、功能:定義指向“數(shù)據(jù)類型”變量或數(shù)組的若干個(gè)指針變量, 同時(shí)給這些指針變量賦初值。這些指針變量具有確定 的“存儲類型”。,1、指針變量的定義和初始化格式,返回,說明:,(1)指針變量名的構(gòu)成原則是標(biāo)識符,前面必須有“*”號。,(2)在一個(gè)定義語句中,可以同時(shí)定義普通變量、數(shù)組、 指針變量。,(3)定義指針變量時(shí)的“數(shù)據(jù)類型”可以選取任何基本數(shù)據(jù)類 型,也可以選取以后介紹的其它數(shù)據(jù)類型。這個(gè)數(shù)據(jù)類 型不是指針型變量中存放的數(shù)據(jù)類型,而是它將要指向 的變量或數(shù)組的數(shù)據(jù)類型。,(4)省略“存儲類型”,默認(rèn)為自動(dòng)型(auto)。,(5)其中的“初值”通常是“&普通變量名”、“&數(shù)組變量名”或 “數(shù)組名”,這個(gè)普通變量或數(shù)組必須在前面已定義。即 這個(gè)普通變量或數(shù)組可以是在本語句的前面出現(xiàn)的定義 語句中定義的,也可以是在本定義語句中出現(xiàn)的,但必 須是在對應(yīng)指針變量前出現(xiàn)。,(6)一個(gè)定義語句中,可以只給部分指針變量賦初值。,例:指針變量的定義和初始化。 int a; int *p=,(二)、指針變量的引用方式,1、給指針變量賦值,使用格式為:指針變量表達(dá)式。 這個(gè)表達(dá)式必須是地址型表達(dá)式,例如:int i,*p_i; p_i=,2、直接引用指針變量名,需要用到地址時(shí),可以直接引用指針變量名。,例如:int i,j,*p=,3、通過指針變量來引用所指向的變量,使用格式為:* 指針變量名。在程序中“* 指針變量名”代表它 所指向的變量。,例如:int i=1,j=2,k,*p=,(三)、取地址運(yùn)算符與指針運(yùn)算符,取地址運(yùn)算符和指針運(yùn)算符的運(yùn)算對象、運(yùn)算規(guī)則、結(jié) 合性如表所示。,取地址運(yùn)算符的運(yùn)算對象必須是已定義過的變量或數(shù)組 元素,但不可以是數(shù)組名。運(yùn)算結(jié)果是運(yùn)算對象的地址。例如, 定義了變量a、數(shù)組b10,則&a、&b0、&b9均合法,分別代 表變量a的地址、數(shù)組元素b0的地址、數(shù)組元素b9的地址。 而&b則是錯(cuò)誤的。,指針運(yùn)算符的運(yùn)算對象必須是已賦值的指針變量,不能 是普通變量。運(yùn)算結(jié)果就是所指向的變量。例如已定義了變 量a、數(shù)組b10、指針變量p。若執(zhí)行了“p=&a”,即p已指向了 a,則*p就代表變量a;若執(zhí)行了“p=&b3”,即p已指向了數(shù)組 元素b3,則*p就代表數(shù)組元素b3。注意,當(dāng)指針變量的值為 數(shù)組的首地址時(shí),“* 指針變量”也是正確的,它代表數(shù)組的第一 個(gè)元素。例如,執(zhí)行了“p=b”,即 p已指向了數(shù)組b,則*p就代表 數(shù)組元素b0。,取地址運(yùn)算符和指針運(yùn)算符的運(yùn)算優(yōu)先級別規(guī)定如下:, 取地址運(yùn)算符、指針運(yùn)算符和自增、自減等單目運(yùn)算符是 同級別的 所有單目運(yùn)算符的結(jié)合性均為自右向左,在混合使用運(yùn)算符時(shí),要注意分清它們的運(yùn)算對象和運(yùn)算 時(shí)的結(jié)合性。例如,設(shè)有變量a、指針變量pa,且pa已經(jīng)指向a。 則:,*&a 正確的。相當(dāng)于“*(&a)”,&a是變量a的地址,*(a地址)代 表變量a。 &* a 錯(cuò)誤的。相當(dāng)于“&(*a) ”,因?yàn)閍不是指針變量, 所以* a不正確。 *&pa 正確的。相當(dāng)于“*(&pa)”, &pa是pa的地址,*(pa地址) 代表指針變量pa。 &*pa 正確的。相當(dāng)于“&(*pa)”,*pa代表變量a,&(變量a)代 表a的地址。,四、指針變量的使用,(一)、指向變量的指針變量的使用,1、給指針變量賦值(指針變量地址表達(dá)式),指針變量的引用主要有兩種:一是賦值,二是引用所指向 的變量。,2、引用所指向的變量(* 指針變量),返回,例:用指針變量按從小到大的順序輸出三個(gè)整數(shù)。,main() int a,b,c,*pa= ,(二)、指向一維數(shù)組的指針變量的使用,當(dāng)指針變量已指向數(shù)組后,就可以用指針變量來處理數(shù) 組中的每個(gè)元素。處理數(shù)組元素的關(guān)鍵是引用數(shù)組元素,引 用數(shù)組的方法與指針指向數(shù)組的方式有關(guān):, 當(dāng)指針變量指向數(shù)組首地址時(shí),引用數(shù)組元素的方法如下:,引用“數(shù)組元素0” * (指針變量0) 或 * 指針變量 引用“數(shù)組元素i” * (指針變量i),1、用指向一維數(shù)組的指針變量處理數(shù)組元素, 當(dāng)指針變量指向下標(biāo)為i的數(shù)組元素時(shí),引用數(shù)組元素的方 法如下:,引用“數(shù)組元素i” * (指針變量0) 或 * 指針變量 引用“數(shù)組元素i-k” * (指針變量-k) 引用“數(shù)組元素i+k” * (指針變量k), 當(dāng)指針變量指向首地址后,對下標(biāo)為i的數(shù)組元素引用一共 有下列四種方法:,* (指針變量i) * (數(shù)組名i) 指針變量i 數(shù)組名i,前兩種引用數(shù)組元素的方法使用了“指針運(yùn)算符”,稱為 “指針法”;后兩種引用數(shù)組元素的方法使用了“下標(biāo)運(yùn)算符()” 稱為“下標(biāo)法”。,注意: 指針變量是存放地址這種數(shù)據(jù)類型的變量,可以按照變 量的處理方式對其進(jìn)行運(yùn)算;而數(shù)組名僅僅是一個(gè)地址常量, 只能按照常量的方式進(jìn)行處理。,2、指向一維數(shù)組的指針變量的運(yùn)算,當(dāng)指針變量已指向數(shù)組后,對指針變量可以進(jìn)行算術(shù)和 關(guān)系運(yùn)算。,(1)指針變量和整數(shù)的算術(shù)運(yùn)算。 對指針變量進(jìn)行算術(shù)運(yùn)算的規(guī)則如下:,指針變量整數(shù) “指針變量中的地址整數(shù)*指針變量類型占 用單元數(shù)”對應(yīng)的地址,指針變量整數(shù) “指針變量中的地址整數(shù)*指針變量類型占 用單元數(shù)”對應(yīng)的地址,指針變量 “指針變量中的地址指針變量類型占用單元 數(shù)”對應(yīng)的地址,此后,指針變量將指向下一 個(gè)數(shù)組元素。,指針變量 “指針變量中的地址指針變量類型占用單元 數(shù)”對應(yīng)的地址,此后,指針變量將指向上一 個(gè)數(shù)組元素。,指針變量 “指針變量中的地址”對應(yīng)的地址(因?yàn)槭呛缶Y 減1運(yùn)算符),此后,指針變量將指向上一個(gè) 數(shù)組元素。,指針變量 “指針變量中的地址”對應(yīng)的地址(因?yàn)槭呛缶Y 增1運(yùn)算符),此后,指針變量將指向下一個(gè) 數(shù)組元素。,上述運(yùn)算規(guī)則組成的式子稱為表達(dá)式,這種表達(dá)式的類 型是“地址型”,所以上述規(guī)則組成的表達(dá)式常稱為“地址型表 達(dá)式”或“指針型表達(dá)式”,簡稱為“指針表達(dá)式”。,例如:設(shè)定義了整型數(shù)組a10,整型指針變量pa,且執(zhí)行了 pa=a。假定數(shù)組a的首地址為2000。請看下列的表達(dá)式及其 運(yùn)算結(jié)果:,執(zhí)行papa5后 pa指向數(shù)組元素a5,pa的地址值將為 20005*22010,其中的“2”是整型數(shù)據(jù) 占用的單元數(shù);,再執(zhí)行pa后 pa將指向數(shù)組元素a4,pa的地址值將為 20101*22008。,注意:對代表地址常量的數(shù)組名不能進(jìn)行增1減1的算術(shù)運(yùn)算, +a、a+、-a、a-、a=a+5、a=a-5都是錯(cuò)誤的。(其中a為 數(shù)組名),(2)指針變量和指針變量的減法運(yùn)算,指針變量和指針變量的減法運(yùn)算規(guī)則如下: 指針變量1指針變量2,要求這兩個(gè)指針變量必須指向同一個(gè)數(shù)組,否則不能進(jìn)行 減法運(yùn)算。運(yùn)算 結(jié)果為它們所指向的數(shù)組元素下標(biāo)相差的整 數(shù)。例如,定義了數(shù)組a和同類型的指針變量p1、p2。其中p1 指向數(shù)組元素a2;p2指向數(shù)組元素a6。,p1p2 結(jié)果為整數(shù)4 p2p1 結(jié)果為整數(shù)4,(3)指針變量的關(guān)系運(yùn)算。,對指針變量進(jìn)行關(guān)系運(yùn)算對規(guī)則如下: 指針變量1 關(guān)系運(yùn)算符 指針變量2,當(dāng)兩個(gè)指針變量的值(地址值)滿足關(guān)系運(yùn)算時(shí),結(jié)果 為1(真)否則結(jié)果為0(假)。例如,定義了數(shù)組a和同類型的指針 變量p1、p2;使p1指向數(shù)組元素a2;p2指向數(shù)組元素a3。 請看下列關(guān)系表達(dá)式及其運(yùn)算結(jié)果:,p1p2 結(jié)果為1(真)。 p1p2 結(jié)果為0(假),注意是后綴。 p2p1 結(jié)果為1(真),注意是前綴。 p1a 結(jié)果為0(假),a是地址常量。 p1&a9 結(jié)果為1(真), &a9是地址常量。 p2=a3 結(jié)果為1(真),a3是地址型表達(dá)式, 代表a3的地址。,例:輸入10個(gè)整數(shù)存入一維數(shù)組,從中查找某個(gè)整數(shù)(該數(shù)從 鍵盤上讀取),查到則輸出其是第幾個(gè)數(shù),查不到則輸出“Not Find!”。要求用指針法處理。,程序清單如下:,main() int a10,*p=a,x,n,flag=0; for (;pa+10;p+) scanf(“%d”,p); scanf(“%d”, ,3、關(guān)于使用“指針法”處理一維數(shù)組元素的下標(biāo)越界問題,C語言對用“指針法”引用數(shù)組元素時(shí),對下標(biāo)是否越界也 不作檢查,即允許下標(biāo)越界。,例如,定義了整型數(shù)組a10,并使同類型的指針變量p指向了 數(shù)組a的首地址。則下列對a數(shù)組的元素引用都是允許的:,*(p-1) 代表數(shù)組元素a0前面2個(gè)單元中存放的數(shù)據(jù) (看成整數(shù)) *(p+10) 代表數(shù)組元素a0前面2個(gè)單元中存放的數(shù)據(jù) (看成整數(shù)),雖然C語言允許處理數(shù)組元素時(shí)下標(biāo)可以越界,但在程序 中要盡量避免。當(dāng)出現(xiàn)下標(biāo)越界的情況,如果你使用的是數(shù)組 元素值,顯然這個(gè)值不知為何值;如果你是將某個(gè)值存入該數(shù) 組元素,結(jié)果將會破壞對應(yīng)內(nèi)存單元中原來的值,使得后面程 序運(yùn)行時(shí),結(jié)果不正確,甚至出現(xiàn)預(yù)料不到的問題,而這樣的 錯(cuò)誤很難查找。,(三)、指向字符串的指針變量的使用,如果字符串是存放在某個(gè)字符數(shù)組中,可以用賦初值或 賦值方式將指針變量指向該字符數(shù)組,以后可以用指針變量 來處理字符數(shù)組中存放的字符串,也可以使用指針變量來處 理其中的單個(gè)字符,處理方法類似于一維數(shù)組。,在C語言中允許直接使用字符串常量,并不一定要求字符 串存放在字符數(shù)組中。這樣的字符串常量可以用字符型指針變 量指向它,以后也可以用字符型指針變量來處理這個(gè)字符串或 字符串中的單個(gè)字符。,1、如何將指針變量指向字符串常量,第一種方法是給指針變量賦初值的方式,格式為“ * 指針變量字符串常量”;,假定要求字符型指針變量p指向字符串常量“abcd”;可以采 用下列兩種方式:,第二種方法是先定義一個(gè)字符型指針變量,然后通過賦值 方式,其格式為“指針變量字符串常量”。,方法一 char *p=“abcd”; 方法二 char *p; p=“abcd”;,可以用賦值方式使指針變量指向字符串常量,但是不允 許將字符串常量賦值給字符型數(shù)組。例如,下列的程序段是 錯(cuò)誤的:,char a10; a=“abcd”;,C語言允許在同一個(gè)程序中,使同一個(gè)字符型指針變量先 后指向不同的字符串常量,例如下列的程序段是正確的:,char *pa; pa=“12345678”; pa=“abcd”;, ,2、指向字符串常量的指針變量的使用,當(dāng)一個(gè)字符型指針變量已指向某個(gè)字符串常量,就可以 利用指針變量來處理這個(gè)字符串。處理的方式主要有兩種:,(1)處理整個(gè)字符串。 輸出字符串 printf(“%s”,指針變量); 輸入新的字符串代替原字符串 scanf(“%s”,指針變量);,(2)處理字符串中的單個(gè)字符。 第i個(gè)字符的表示方法 * (指針變量i),3、指向存放字符串的字符數(shù)組的指針變量的使用,當(dāng)一個(gè)字符串已經(jīng)存放在一個(gè)字符型數(shù)組中,并且用指 針變量指向這個(gè)字符數(shù)組,處理字符串中的單個(gè)字符就是處 理一維數(shù)組的元素,處理方法和前面介紹的處理一維數(shù)組元 素完全相同,唯一需要注意的是,數(shù)組元素的類型是字符型。,例:用字符型指針p指向字符串常量“12345678”,然后反復(fù)從 鍵盤上輸入字符串,若大于給定的字符串常量,則輸出“More larger!”;若小于給定的字符串常量,則輸出“More Smaller!”。 直到輸入的字符串等于這個(gè)字符串常量時(shí)結(jié)束。,程序清單如下:,main() char *p=“12345678”,a10,*pa,*pp,flag; while (1) gets(a); pp=p; pa=a; flag=m; while (*pp!=0) if (*pa*pp) flag=g;break; if (*pa*pp) flag=l;break; pa+,pp+; If (flag=m),if (flag=m) break; else if (flag=g) print(“More Larger!”); else printf(“More Smaller!”); printf(“%s=%sn”,p,a); ,指針二,單元15 指針(二),15.1 指向二維數(shù)組的指針變量的使用,15. 2 指針數(shù)組和多級指針,15. 3 指針應(yīng)用程序設(shè)計(jì)例,一、指向二維數(shù)組的指針變量的使用,1、指針變量指向二維數(shù)組的某個(gè)元素,當(dāng)指針變量指向二維數(shù)組的某個(gè)元素時(shí),利用指針變量 來處理該數(shù)組元素和處理一維數(shù)組元素的方法相同。,(1)讓指針變量指向二維數(shù)組的某個(gè)元素的方法。 用賦初值方式的格式為:* 指針變量&數(shù)組名下標(biāo)1下標(biāo)2 用賦值方式的格式為:指針變量&數(shù)組名下標(biāo)1下標(biāo)2,(2)二維數(shù)組元素的引用方法。 當(dāng)指針變量已指向二維數(shù)組元素后,引用該數(shù)組元素的方法 是:* 指針變量,返回,例1:輸入2行3列的矩陣元素后,存入二維數(shù)組。再按行列 格式輸出。,main() int a23,*p; int i,j; for (i=0;i2;i+) for (j=0;j3;j+) p= ,程序如下:,2、指針變量指向二維數(shù)組的首地址,當(dāng)指針變量指向二維數(shù)組的首地址時(shí),也可以處理數(shù)組中 的任何一個(gè)元素。,(1)讓指針變量指向二維數(shù)組首地址的方法。,使用賦初值或賦值方式都可以使指針變量指向二維數(shù)組的 首地址。,用賦初值方式的格式有兩種: * 指針變量二維數(shù)組名 * 指針變量&二維數(shù)組名00,用賦值方式的格式也有兩種: 指針變量二維數(shù)組名 指針變量&二維數(shù)組名00,(2)二維數(shù)組元素的引用方法。,當(dāng)指針變量已指向二維數(shù)組的首地址后,引用該數(shù)組 第i行第j列的元素的方法是: *(指針變量i*列數(shù)j),例如:已定義了二維數(shù)組a23,其2行3列元素在內(nèi)存中排列 順序如下:,如果定義指針變量p并且指向數(shù)組a的首地址,則這些元素 的地址和引用方法如下:,元素,元素地址,元素引用,a00 p+0*3+0=p *(p+0*3+0)=*(p) a01 p+0*3+1=p+1 *(p+0*3+1)=*(p+1) a02 p+0*3+2=p+2 *(p+0*3+2)=*(p+2) a10 p+1*3+0=p+3 *(p+1*3+0)=*(p+3) a11 p+1*3+1=p+4 *(p+1*3+1)=*(p+4) a12 p+1*3+2=p+5 *(p+1*3+2)=*(p+5),例2:重編例1,要求使用指向二維數(shù)組首地址的指針變量處理 二維數(shù)組元素。,程序清單如下:,main() int a23,*p=a; int i,j; for (i=0;i2;i+) for (j=0;j3;j+) scanf(“%d”,p+i*3+j); for (i=0;i2;i+) printf(“n”); for (j=0;j3;j+) printf(“%10d”,*(p+i*3+j); ,例3:重編例1,要求用指向二維數(shù)組首地址的指針變量按一維 數(shù)組方式處理。,main() int a23,*p=a; int i,j; for (i=0;i2;i+) for (j=0;j3;j+) scanf(“%d”,p); p+; p=a; for (i=0;i2;i+) printf(“n”); for (j=0;j3;j+) printf(“%10d”,*p); p+; ,3、指針變量指向二維數(shù)組中某個(gè)一維數(shù)組,(1)讓指針變量指向二維數(shù)組中某個(gè)一維數(shù)組的方法。,如果你希望將指針變量指向二維數(shù)組中某個(gè)一維數(shù)組, 首先要按下列格式定義一個(gè)指針變量: (* 指針變量)m 其中的m是對應(yīng)二維數(shù)組的列長度,然后再用賦初值或賦值方式將該指針變量指向二維數(shù)組的 首地址 (* 指針變量)m二維數(shù)組名 (賦初值) 指針變量二維數(shù)組名 (賦值),二維數(shù)組中第i行對應(yīng)的一維數(shù)組首地址可以用下列表達(dá) 式來獲得: * (指針變量i),使用這種指針變量,需要注意以下幾點(diǎn):, 定義這種指針變量時(shí),圓括號不能丟。, 定義這種指針變量時(shí),m必須是整型常量表達(dá)式,并且其值 要等于希望指向的一維數(shù)組的長度。, 定義這種指針變量后,賦初值或賦值時(shí)應(yīng)該賦予列長度為m 的二維數(shù)組首地址,然后用表達(dá)式方式來獲得二維數(shù)組中某 個(gè)一維數(shù)組的首地址。,(2)二維數(shù)組元素的引用方法。,當(dāng)某個(gè)指向一維數(shù)組的指針變量已指向?qū)?yīng)二維數(shù)組的首 地址后,就可以用像處理一維數(shù)組元素的方式來處理這個(gè)二維 數(shù)組中已指向的一維數(shù)組。具體的格式如下:,數(shù)組元素地址 *(指針變量行下標(biāo))列下標(biāo) 數(shù)組元素引用 *(*(指針變量行下標(biāo))列下標(biāo)),例如語句“int a25,(*p)5=a;”定義了二維數(shù)組a25和 指向具有5個(gè)元素的一維數(shù)組指針變量p,并且使p指向二維數(shù) 組a的首地址。則對應(yīng)二維數(shù)組中2個(gè)一維數(shù)組的首地址如下:,二維數(shù)組中的一維數(shù)組,用指針變量表示對應(yīng)一維數(shù)組 的首地址,a0 a1,*(p0) *(p1),二維數(shù)組元素的引用格式如下:,數(shù)組元素 a00 a01 a02 a03 a04 引用格式 *(*(p+0)+0) *(*(p+0)+1) *(*(p+0)+2) *(*(p+0)+3) *(*(p+0)+4) 數(shù)組元素 a10 a11 a12 a13 a14 引用格式 *(*(p+1)+0) *(*(p+1)+1) *(*(p+1)+2) *(*(p+1)+3) *(*(p+1)+4),例4:重編例1,要求使用指向二維數(shù)組中一維數(shù)組的指針變量,程序清單如下:,main() int a23,(*p)3=a; int i,j; for (i=0;i2;i+) for (j=0;j3;j+) scanf(“%d”,*(p+i)+j); for (i=0;i2;i+) printf(“n”); for (j=0;j3;j+) printf(“%10d”,*(*(p+i)+j); ,二、指針數(shù)組和多級指針,當(dāng)某個(gè)數(shù)組被定義為指針類型,就稱這樣的數(shù)組為指針 數(shù)組。指針數(shù)組中的每個(gè)元素都相當(dāng)于一個(gè)指針型變量,只 能存放地址型數(shù)據(jù)。當(dāng)定義的某個(gè)指針型變量專門用來存放 其它指針變量的地址時(shí),這樣的指針變量就稱為指針的指針, 也叫二級指針。,1、指針數(shù)組的定義,需要注意指針數(shù)組是指針類型的,對其元素所賦的值必須 是地址值。,返回,格式 存儲類型 數(shù)據(jù)類型 * 指針數(shù)組名1長度1初值1,功能 定義指向“數(shù)據(jù)類型”變量或數(shù)組的指針型數(shù)組,同時(shí)給 指針數(shù)組元素賦初值。這些指針變量具有指定的“存儲 類型”。,說明 (1)指針數(shù)組名是標(biāo)識符,前面必須有“*”號。,(2)在一個(gè)定義語句中,可以同時(shí)定義普通變量、數(shù)組、指 針變量、指針數(shù)組??梢越o某些指針數(shù)組賦初值,而另 一些指針數(shù)組不賦初值。,(3)定義指針變量時(shí)的“數(shù)據(jù)類型”可以選取任何基本數(shù)據(jù)類 型,也可以選取其它數(shù)據(jù)類型。,(4)省略“存儲類型”,默認(rèn)為自動(dòng)型(auto)。,(5)其中的“初值”與普通數(shù)組賦初值的格式相同,每個(gè)初值 通常是“&普通變量名”、 “&數(shù)組元素”或“數(shù)組名”,對應(yīng) 的普通變量或數(shù)組必須在前面已定義。,(6)注意語句中指針型數(shù)組的書寫格式,不能寫成“ (* 數(shù)組名)長度”,因?yàn)檫@是定義指向含有“長度”這個(gè) 元素的一維數(shù)組的指針變量。,例如有定義語句“int a,b,c,*p3”,2、指針數(shù)組元素的引用, 引用所指向的普通變量或數(shù)組元素 * 指針數(shù)組名下標(biāo) 對其賦值 指針數(shù)組名下標(biāo)地址表達(dá)式 參加運(yùn)算 (賦值運(yùn)算) 指針變量指針數(shù)組名下標(biāo) (算術(shù)運(yùn)算) 指針數(shù)組名下標(biāo)整數(shù) 指針數(shù)組名下標(biāo)整數(shù) 指針數(shù)組名下標(biāo) 指針數(shù)組名下標(biāo) 指針數(shù)組名下標(biāo) 指針數(shù)組名下標(biāo) (關(guān)系運(yùn)算)指針數(shù)組名下標(biāo) 關(guān)系運(yùn)算符 指針數(shù)組名下標(biāo),其中,算術(shù)運(yùn)算和關(guān)系運(yùn)算一般只使用于該指針數(shù)組元素 指向某個(gè)數(shù)組時(shí)。,例5:輸入5個(gè)字符串存入一個(gè)二維數(shù)組中,然后定義一個(gè)指針 數(shù)組,使其元素分別指向這5個(gè)字符串并輸出。,程序清單如下:,main() char s520,*p5; int i; for (i=0;i5;i+) pi=si; for (i=0;i5;i+) scanf(“%s”,pi); for (i=0;i5;i+) printf(“%sn”,pi); ,3、多級指針的定義和應(yīng)用,在C語言中,把這種指針型變量稱為“指針的指針”,意為 這種變量是指向指針變量的指針變量,也稱多級指針。通常使 用的多級指針是二級指針,相對來說,前面介紹的指針變量可 以稱為“一級指針變量”。,二級指針變量的定義和賦初值方法如下:,格式 存儲類型 數(shù)據(jù)類型 *指針變量名初值,,功能 定義指向“數(shù)據(jù)類型”指針變量的二級指針變量,同時(shí)給 二級指針變量賦初值。,說明,(1)二級指針變量名的構(gòu)成原則是標(biāo)識符,前面必須有“* *”號。,(2)在一個(gè)定義語句中,可以同時(shí)定義普通變量、數(shù)組、指針 變量、指針數(shù)組、二級指針變量等??梢越o某些二級
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 整車制造綠色環(huán)保技術(shù)應(yīng)用考核試卷
- 木材采伐作業(yè)成本控制考核試卷
- 衛(wèi)生材料的社會影響與企業(yè)責(zé)任考核試卷
- 在建工地安全課件模板
- 工廠院內(nèi)改造合同范本
- 公司聘用合同范本6
- 土地小院出租合同范本
- 團(tuán)隊(duì)合作合同范本
- 鋁廠服裝租借合同范本
- 小學(xué)生注意力課件
- 《調(diào)整心態(tài)迎接中考》主題班會
- 冠心病患者運(yùn)動(dòng)恐懼的現(xiàn)狀及影響因素分析
- 全國2018年10月自考00043經(jīng)濟(jì)法概論(財(cái)經(jīng)類)試題及答案
- 《又見平遙》課件
- 噴涂設(shè)備點(diǎn)檢表
- 廣東省佛山市《綜合基礎(chǔ)知識》事業(yè)單位國考真題
- 02 第2章 城市與城市化-城市管理學(xué)
- 六年級上冊英語教案-Culture 2 Going Green 第二課時(shí) 廣東開心英語
- 警察叔叔是怎樣破案的演示文稿課件
- 2019石景山初三一模語文試題及答案
- 09式 新擒敵拳 教學(xué)教案 教學(xué)法 圖解
評論
0/150
提交評論