在這一章中將介紹C語言程序的指針_第1頁
在這一章中將介紹C語言程序的指針_第2頁
在這一章中將介紹C語言程序的指針_第3頁
在這一章中將介紹C語言程序的指針_第4頁
在這一章中將介紹C語言程序的指針_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第第7 7章章 指針指針 在這一章中將介紹在這一章中將介紹C語言程序的指針,指語言程序的指針,指針是一內(nèi)存中的地址,任何一個(gè)變量在內(nèi)存中針是一內(nèi)存中的地址,任何一個(gè)變量在內(nèi)存中都有一個(gè)空間,這個(gè)空間有一個(gè)地址,這個(gè)地都有一個(gè)空間,這個(gè)空間有一個(gè)地址,這個(gè)地址就是變量的指針,通過指針可以實(shí)現(xiàn)對內(nèi)存址就是變量的指針,通過指針可以實(shí)現(xiàn)對內(nèi)存的直接訪問。的直接訪問。7.1 指針概述指針概述7.2 指針與函數(shù)參數(shù)指針與函數(shù)參數(shù)7.3 指針與數(shù)組指針與數(shù)組7.4 數(shù)組與函數(shù)參數(shù)數(shù)組與函數(shù)參數(shù)7.5 字符串與指針字符串與指針7.6 指針與二維數(shù)組指針與二維數(shù)組7.7 動(dòng)態(tài)數(shù)組動(dòng)態(tài)數(shù)組7.1 指針概述指針概述

2、 在計(jì)算機(jī)中,所有的數(shù)據(jù)都是存放在存儲在計(jì)算機(jī)中,所有的數(shù)據(jù)都是存放在存儲器中的,不同的數(shù)據(jù)類型所占用的內(nèi)存單元數(shù)器中的,不同的數(shù)據(jù)類型所占用的內(nèi)存單元數(shù)不等,如不等,如int整型量占整型量占4個(gè)字節(jié),字符量占個(gè)字節(jié),字符量占1個(gè)字個(gè)字節(jié)。為了正確地訪問這些內(nèi)存單元,節(jié)。為了正確地訪問這些內(nèi)存單元, 必須為每必須為每個(gè)內(nèi)存單元編上號,根據(jù)一個(gè)內(nèi)存單元的編號個(gè)內(nèi)存單元編上號,根據(jù)一個(gè)內(nèi)存單元的編號即可準(zhǔn)確地找到該內(nèi)存單元。內(nèi)存單元的編號即可準(zhǔn)確地找到該內(nèi)存單元。內(nèi)存單元的編號也叫做地址。也叫做地址。 既然根據(jù)內(nèi)存單元的編號或地址既然根據(jù)內(nèi)存單元的編號或地址就可以找到所需的內(nèi)存單元,所以通常也把這

3、就可以找到所需的內(nèi)存單元,所以通常也把這個(gè)地址稱為指針。個(gè)地址稱為指針。 1 指針變量指針變量 系統(tǒng)的指針地址可以用一個(gè)變量來存儲,這系統(tǒng)的指針地址可以用一個(gè)變量來存儲,這個(gè)變量就是指針變量。指針變量的定義規(guī)則是:個(gè)變量就是指針變量。指針變量的定義規(guī)則是: 數(shù)據(jù)類型數(shù)據(jù)類型 * 變量名稱;變量名稱; 指針變量的定義與普通變量十分相似,只是在其指針變量的定義與普通變量十分相似,只是在其中插入了一個(gè)中插入了一個(gè)“*”號,例如:號,例如: int *p; p是指針變量,可以用來存儲一個(gè)整數(shù)變量的地址,是指針變量,可以用來存儲一個(gè)整數(shù)變量的地址,或稱它指向一個(gè)整數(shù)變量?;蚍Q它指向一個(gè)整數(shù)變量。嚴(yán)格地說

4、,一個(gè)指針嚴(yán)格地說,一個(gè)指針是一個(gè)地址,是一個(gè)常量。而一個(gè)指針變量卻可是一個(gè)地址,是一個(gè)常量。而一個(gè)指針變量卻可以被賦予不同的指針值,是變量,但通常把指針以被賦予不同的指針值,是變量,但通常把指針變量簡稱為指針。變量簡稱為指針。 2 指針變量的賦值指針變量的賦值 指針變量是一個(gè)可以存儲指針值的變量,在指針變量是一個(gè)可以存儲指針值的變量,在32位系統(tǒng)中它占位系統(tǒng)中它占4個(gè)字節(jié),可以把一個(gè)變量用個(gè)字節(jié),可以把一個(gè)變量用&取地址后賦值給這個(gè)指針變量,例如:取地址后賦值給這個(gè)指針變量,例如: int a=1,*p; p=&a; 此時(shí)此時(shí)p存儲了變量存儲了變量a的地址。注意變量的地址。注

5、意變量p本身本身也是一個(gè)變量,它自己也有一個(gè)存儲單元,這個(gè)也是一個(gè)變量,它自己也有一個(gè)存儲單元,這個(gè)存儲單元顯然與變量存儲單元顯然與變量a的存儲單元是不同的,變的存儲單元是不同的,變量量a的存儲單元存儲的是變量的存儲單元存儲的是變量a的值,而變量的值,而變量p存存儲單元存儲的是變量儲單元存儲的是變量a單元的地址,如圖單元的地址,如圖7-3所示。所示。 圖7-3 變量指針與指針變量 指針變量是有類型的,例如:指針變量是有類型的,例如: int *p; char *q; 則則p是一個(gè)指向整數(shù)變量的指針變量,是一個(gè)指向整數(shù)變量的指針變量,q是一個(gè)是一個(gè)指向字符變量的指針變量,在對它們賦值時(shí)要指向字符

6、變量的指針變量,在對它們賦值時(shí)要注意類型匹配,例如:注意類型匹配,例如: int *p,a; char *q,c; p=&a; / 正確正確 q=&c; / 正確正確 p=&c; / 錯(cuò)誤錯(cuò)誤 q=&a; / 錯(cuò)誤錯(cuò)誤 一般要保證變量類型與指針類型一致,不一般要保證變量類型與指針類型一致,不能把一種類型的變量的指針賦值給另外一種不能把一種類型的變量的指針賦值給另外一種不同類型的指針變量。但是由于指針畢竟是一個(gè)同類型的指針變量。但是由于指針畢竟是一個(gè)內(nèi)存地址,從物理上來說,內(nèi)存地址,從物理上來說,p與與q都是內(nèi)存地址,都是內(nèi)存地址,在在32位系統(tǒng)中都是位系統(tǒng)中都是

7、32位二進(jìn)制地址值,沒有什位二進(jìn)制地址值,沒有什么本質(zhì)區(qū)別,因此經(jīng)過轉(zhuǎn)化后還是可以交叉賦么本質(zhì)區(qū)別,因此經(jīng)過轉(zhuǎn)化后還是可以交叉賦值的,通過指針的類型轉(zhuǎn)換可以實(shí)現(xiàn)下列賦值:值的,通過指針的類型轉(zhuǎn)換可以實(shí)現(xiàn)下列賦值: p=(int*)&c; / &c是是char *指針,指針,(int*)轉(zhuǎn)化后成為轉(zhuǎn)化后成為int *類型指針類型指針 q=(char*)&a; / &a是是int *指針,指針,(char*)轉(zhuǎn)化后成為轉(zhuǎn)化后成為char *類型指針類型指針 一般指針變量類型的轉(zhuǎn)換可以通過下面方式完成:一般指針變量類型的轉(zhuǎn)換可以通過下面方式完成: (數(shù)據(jù)類型數(shù)據(jù)類型

8、*)指針指針 另外數(shù)組變量也可以取指針,例如:另外數(shù)組變量也可以取指針,例如: int a5,*p; p=&a0; / p指向指向a0變量變量 p=&a4; / p指向指向a4變量變量 關(guān)于數(shù)組與指針的關(guān)系在后面章節(jié)中再進(jìn)一步講解。關(guān)于數(shù)組與指針的關(guān)系在后面章節(jié)中再進(jìn)一步講解。 3通過指針訪問變量通過指針訪問變量 既然指針變量指向一個(gè)變量,因此通過指既然指針變量指向一個(gè)變量,因此通過指針變量也就知道變量的位置,知道位置也就能針變量也就知道變量的位置,知道位置也就能訪問到變量,可以通過指針變量存取變量的值。訪問到變量,可以通過指針變量存取變量的值。 C中規(guī)定通過:中規(guī)定通過: *

9、指針變量指針變量 來訪問對應(yīng)變量的值,例如:來訪問對應(yīng)變量的值,例如: int a=1,b,*p; p=&a; *p=2; / 設(shè)置設(shè)置p指向的變量的值為指向的變量的值為2,既,既a=2 b=*p; / 把把p指向的變量的值賦予指向的變量的值賦予b,既,既b=2 在在C語言中,系統(tǒng)對語言中,系統(tǒng)對“*指針變量指針變量”的解釋是的解釋是根據(jù)指針變量的類型計(jì)算出對應(yīng)變量所占字節(jié)數(shù),根據(jù)指針變量的類型計(jì)算出對應(yīng)變量所占字節(jié)數(shù),之后把指針變量所指的連續(xù)的幾個(gè)字節(jié)的二進(jìn)制之后把指針變量所指的連續(xù)的幾個(gè)字節(jié)的二進(jìn)制數(shù)據(jù)看成是與指針變量同類型的數(shù)據(jù)并存取這一數(shù)據(jù)看成是與指針變量同類型的數(shù)據(jù)并存取這一

10、數(shù)據(jù)。數(shù)據(jù)。7.2 指針與函數(shù)參數(shù)指針與函數(shù)參數(shù) 指針變量與普通變量一樣也可以作為函數(shù)指針變量與普通變量一樣也可以作為函數(shù)參數(shù)來傳遞,實(shí)際參數(shù)是一個(gè)變量的指針,該參數(shù)來傳遞,實(shí)際參數(shù)是一個(gè)變量的指針,該變量的指針傳遞到函數(shù)的形式參數(shù)指針變量,變量的指針傳遞到函數(shù)的形式參數(shù)指針變量,這樣形式參數(shù)的指針變量仍然指向?qū)嶋H參數(shù),這樣形式參數(shù)的指針變量仍然指向?qū)嶋H參數(shù),換句話說就是在函數(shù)中可以訪問主函數(shù)的實(shí)際換句話說就是在函數(shù)中可以訪問主函數(shù)的實(shí)際參數(shù)。參數(shù)。 但要注意函數(shù)如返回一個(gè)指針,則這個(gè)指但要注意函數(shù)如返回一個(gè)指針,則這個(gè)指針指向的變量必須有效,不能返回一個(gè)函數(shù)局針指向的變量必須有效,不能返回一

11、個(gè)函數(shù)局部變量的指針,這個(gè)指針是無意義的,因?yàn)楹孔兞康闹羔?,這個(gè)指針是無意義的,因?yàn)楹瘮?shù)的局部變量在函數(shù)退出時(shí)已經(jīng)銷毀了。數(shù)的局部變量在函數(shù)退出時(shí)已經(jīng)銷毀了。 在前面章節(jié)中曾經(jīng)介紹過當(dāng)變量作為函數(shù)在前面章節(jié)中曾經(jīng)介紹過當(dāng)變量作為函數(shù)參數(shù)時(shí),它是函數(shù)的一個(gè)局部變量,它在函數(shù)參數(shù)時(shí),它是函數(shù)的一個(gè)局部變量,它在函數(shù)內(nèi)的改變不會影響到主函數(shù)的對應(yīng)實(shí)參數(shù)變量。內(nèi)的改變不會影響到主函數(shù)的對應(yīng)實(shí)參數(shù)變量。但如把指針變量作為函數(shù)參數(shù)來傳遞情況有不但如把指針變量作為函數(shù)參數(shù)來傳遞情況有不同,通過該指針變量去改變對應(yīng)變量的值會影同,通過該指針變量去改變對應(yīng)變量的值會影響到主函數(shù)對應(yīng)的變量。響到主函數(shù)對應(yīng)的變量

12、。例例7_5:值傳遞與地址傳遞規(guī)則。:值傳遞與地址傳遞規(guī)則。#include void fun(int *p,int b) printf(fun中中: p=%p *p=%d &b=%p b=%dn,p,*p,&b,b); *p=100; b=100;void main() int a=1,b=2,*p; p=&a; printf(調(diào)用前調(diào)用前: p=%p a=%d &b=%p b=%dn,p,a,&b,b); fun(p,b); printf(調(diào)用前調(diào)用前: p=%p a=%d &b=%p b=%dn,p,a,&b,b); C語言中把函數(shù)

13、參數(shù)是指針變量的傳遞方語言中把函數(shù)參數(shù)是指針變量的傳遞方法稱為地址傳遞,它傳遞的是變量的地址,因法稱為地址傳遞,它傳遞的是變量的地址,因此在函數(shù)中用此地址改變對應(yīng)變量的值時(shí),實(shí)此在函數(shù)中用此地址改變對應(yīng)變量的值時(shí),實(shí)際上改變的是主函數(shù)中的變量的值。而把函數(shù)際上改變的是主函數(shù)中的變量的值。而把函數(shù)參數(shù)是普通變量的傳遞稱為值傳遞,它傳遞的參數(shù)是普通變量的傳遞稱為值傳遞,它傳遞的是實(shí)際參數(shù)的值,而且它是函數(shù)的局部變量,是實(shí)際參數(shù)的值,而且它是函數(shù)的局部變量,因此它的值在函數(shù)中改變時(shí)不會影響到主函數(shù)因此它的值在函數(shù)中改變時(shí)不會影響到主函數(shù)中實(shí)際參數(shù)的值。中實(shí)際參數(shù)的值。7.3 指針與數(shù)組指針與數(shù)組 i

14、nt a5; 則則a0、a1、a2、a3、a4都是整數(shù)變量,都是整數(shù)變量,既然是變量它們在內(nèi)存中有對應(yīng)的存儲空間,既然是變量它們在內(nèi)存中有對應(yīng)的存儲空間,也就可以取出其指針地址,而且這些地址是連也就可以取出其指針地址,而且這些地址是連續(xù)的,因?yàn)閿?shù)組單元是連續(xù)的。續(xù)的,因?yàn)閿?shù)組單元是連續(xù)的。 既然數(shù)組的單元是連續(xù)存放的,因此只要知既然數(shù)組的單元是連續(xù)存放的,因此只要知道數(shù)組第一個(gè)單元的地址,那么整個(gè)數(shù)組中任何道數(shù)組第一個(gè)單元的地址,那么整個(gè)數(shù)組中任何一個(gè)單元的地址也就可以計(jì)算出來,或者說只要一個(gè)單元的地址也就可以計(jì)算出來,或者說只要掌握了數(shù)組的第一個(gè)單元的指針,整個(gè)數(shù)組就掌掌握了數(shù)組的第一個(gè)單元

15、的指針,整個(gè)數(shù)組就掌握在手中了。握在手中了。 數(shù)組第一個(gè)單元的指針稱為數(shù)組的首地址,數(shù)組第一個(gè)單元的指針稱為數(shù)組的首地址,也稱為數(shù)組的地址,在也稱為數(shù)組的地址,在C語言中數(shù)組的首地址直語言中數(shù)組的首地址直接用數(shù)組名稱得到,例如數(shù)組接用數(shù)組名稱得到,例如數(shù)組 int a5; 則則a就是數(shù)組的首地址,也就是說,就是數(shù)組的首地址,也就是說,a就是就是&a0,a就是指向數(shù)組的指針。實(shí)際上這一規(guī)則對于任就是指向數(shù)組的指針。實(shí)際上這一規(guī)則對于任何類型的數(shù)組都是一樣的。何類型的數(shù)組都是一樣的。 圖7-11 int a5數(shù)組指針 既然數(shù)組名稱就是數(shù)組的首地址,也就可以通既然數(shù)組名稱就是數(shù)組的首地址,也

16、就可以通過數(shù)組指針去訪問數(shù)組的任何一個(gè)單元了,方法過數(shù)組指針去訪問數(shù)組的任何一個(gè)單元了,方法是把數(shù)組的地址指針加上一個(gè)作為數(shù)組下標(biāo)的整是把數(shù)組的地址指針加上一個(gè)作為數(shù)組下標(biāo)的整數(shù)就是數(shù)組的對應(yīng)單元的地址。例如:數(shù)就是數(shù)組的對應(yīng)單元的地址。例如: int a5; a是數(shù)組的首地址,既是數(shù)組的首地址,既&a0,而,而a+1是是a1的地址,的地址,既既&a1,*(a+1)是對應(yīng)的單元變量,既是對應(yīng)的單元變量,既a1。一。一般如般如i是數(shù)組的整數(shù)下標(biāo),則是數(shù)組的整數(shù)下標(biāo),則a+i是第是第i個(gè)單元的地個(gè)單元的地址,既址,既a+i就是就是&ai,同時(shí),同時(shí)*(a+1)就是就是ai,

17、通過,通過*(a+i)去存取數(shù)組單元的值與用去存取數(shù)組單元的值與用ai去存取是完全去存取是完全一樣的。一樣的。 值得注意的是,值得注意的是,a+i不是簡單把不是簡單把a(bǔ)的二進(jìn)制的二進(jìn)制地址值加了一個(gè)整數(shù)地址值加了一個(gè)整數(shù)i,對于整數(shù)數(shù)組實(shí)際上,對于整數(shù)數(shù)組實(shí)際上a+i從二進(jìn)制值上來說比從二進(jìn)制值上來說比a地址多了地址多了sizeof(int)*i的值。的值。 1 指針移動(dòng)指針移動(dòng) 數(shù)組單元的指針可以通過數(shù)組指針加上一個(gè)數(shù)組單元的指針可以通過數(shù)組指針加上一個(gè)數(shù)組下標(biāo)整數(shù)變量來得到,這種指針運(yùn)算稱為指數(shù)組下標(biāo)整數(shù)變量來得到,這種指針運(yùn)算稱為指針移動(dòng)運(yùn)算。當(dāng)指針加上一個(gè)正整數(shù)時(shí),指針值針移動(dòng)運(yùn)算。當(dāng)

18、指針加上一個(gè)正整數(shù)時(shí),指針值變大了,它指向了存儲器的后面,稱指針后移,變大了,它指向了存儲器的后面,稱指針后移,或向下移動(dòng)。實(shí)際上指針不但可以下移,也可以或向下移動(dòng)。實(shí)際上指針不但可以下移,也可以上移。如指針加上一個(gè)負(fù)整數(shù),指針值變小了,上移。如指針加上一個(gè)負(fù)整數(shù),指針值變小了,它指向了存儲器的前面,稱指針前移,或向上移它指向了存儲器的前面,稱指針前移,或向上移動(dòng)。動(dòng)。 如指針的移動(dòng)僅僅是一個(gè)單元,則常用如指針的移動(dòng)僅僅是一個(gè)單元,則常用+ 或或的運(yùn)算符來實(shí)現(xiàn)。通過指針在數(shù)組范圍內(nèi)的運(yùn)算符來實(shí)現(xiàn)。通過指針在數(shù)組范圍內(nèi)的上下或前后移動(dòng)可以隨意地存取數(shù)組的任何的上下或前后移動(dòng)可以隨意地存取數(shù)組的任

19、何一個(gè)單元。一個(gè)單元。 2 指針比較指針比較 指針在數(shù)組中移動(dòng)之后有前后之分,體現(xiàn)在它指針在數(shù)組中移動(dòng)之后有前后之分,體現(xiàn)在它的二進(jìn)制值有大小之分,因此指針可以通過其二的二進(jìn)制值有大小之分,因此指針可以通過其二進(jìn)制值來比較大小。指針指向后面的,其二進(jìn)制進(jìn)制值來比較大小。指針指向后面的,其二進(jìn)制值大,這樣的指針大;指針指向前面的,其二進(jìn)值大,這樣的指針大;指針指向前面的,其二進(jìn)制值小,這樣的指針小。指針比較主要運(yùn)算有:制值小,這樣的指針小。指針比較主要運(yùn)算有: 大于大于 = 大于等于大于等于 = 小于等于小于等于= 相等相等 !=; 不等于不等于 比較運(yùn)算的結(jié)果是一個(gè)邏輯值,通過比較兩比較運(yùn)算的

20、結(jié)果是一個(gè)邏輯值,通過比較兩個(gè)指針的值可以知道它們在內(nèi)存中的相對位置。個(gè)指針的值可以知道它們在內(nèi)存中的相對位置。 3 指針的減法運(yùn)算指針的減法運(yùn)算 通過比較運(yùn)算可以知道兩個(gè)指針的前后關(guān)通過比較運(yùn)算可以知道兩個(gè)指針的前后關(guān)系,但怎樣知道它們之間的相對距離呢?要知系,但怎樣知道它們之間的相對距離呢?要知道它們的相對距離可以通過計(jì)算兩個(gè)指針的差道它們的相對距離可以通過計(jì)算兩個(gè)指針的差來得到,兩個(gè)指針的差是一個(gè)整數(shù),表示它們來得到,兩個(gè)指針的差是一個(gè)整數(shù),表示它們之間間隔的單元數(shù)(注意不是相差的字節(jié)數(shù))。之間間隔的單元數(shù)(注意不是相差的字節(jié)數(shù))。 7.4 數(shù)組與函數(shù)參數(shù)數(shù)組與函數(shù)參數(shù) 前面已經(jīng)講到過指

21、針可以作為函數(shù)參數(shù),而前面已經(jīng)講到過指針可以作為函數(shù)參數(shù),而數(shù)組與是指針密切相關(guān),因此數(shù)組也可以作為數(shù)組與是指針密切相關(guān),因此數(shù)組也可以作為函數(shù)參數(shù),數(shù)組作為函數(shù)參數(shù)實(shí)際上就是數(shù)組函數(shù)參數(shù),數(shù)組作為函數(shù)參數(shù)實(shí)際上就是數(shù)組指針作為函數(shù)參數(shù),其規(guī)則是:指針作為函數(shù)參數(shù),其規(guī)則是: 函數(shù)類型函數(shù)類型 函數(shù)名稱(數(shù)組類型函數(shù)名稱(數(shù)組類型 數(shù)組名稱數(shù)組名稱);); 或或 函數(shù)類型函數(shù)類型 函數(shù)名稱(數(shù)組類型函數(shù)名稱(數(shù)組類型 *數(shù)組名稱);數(shù)組名稱); 例如:例如: void fun(int a); void fun(int *a); 這兩種方式是等價(jià)的,注意在用第一種方這兩種方式是等價(jià)的,注意在用第

22、一種方式時(shí)不必在式時(shí)不必在中寫數(shù)組的大小。在調(diào)用函數(shù)時(shí)中寫數(shù)組的大小。在調(diào)用函數(shù)時(shí)實(shí)際參數(shù)就是數(shù)組的名稱,也就是數(shù)組指針。實(shí)際參數(shù)就是數(shù)組的名稱,也就是數(shù)組指針。 由于在調(diào)用函數(shù)時(shí)向函數(shù)傳遞的實(shí)際上是由于在調(diào)用函數(shù)時(shí)向函數(shù)傳遞的實(shí)際上是數(shù)組地址,因此要特別注意在函數(shù)中如對數(shù)組數(shù)組地址,因此要特別注意在函數(shù)中如對數(shù)組的單元進(jìn)行了修改,實(shí)際上是對主函數(shù)的數(shù)組的單元進(jìn)行了修改,實(shí)際上是對主函數(shù)的數(shù)組進(jìn)行修改。進(jìn)行修改。 另外一點(diǎn)要指出的是,數(shù)組在傳遞時(shí)傳遞另外一點(diǎn)要指出的是,數(shù)組在傳遞時(shí)傳遞的是數(shù)組指針,它不包含數(shù)組大小的信息,因的是數(shù)組指針,它不包含數(shù)組大小的信息,因此在向函數(shù)傳遞數(shù)組時(shí)一般要用一

23、個(gè)整數(shù)同時(shí)此在向函數(shù)傳遞數(shù)組時(shí)一般要用一個(gè)整數(shù)同時(shí)傳遞數(shù)組的大小。傳遞數(shù)組的大小。 如果實(shí)際參數(shù)是數(shù)組名稱,則向函數(shù)傳遞如果實(shí)際參數(shù)是數(shù)組名稱,則向函數(shù)傳遞的數(shù)組指針,但如實(shí)際參數(shù)是某個(gè)數(shù)組元素,的數(shù)組指針,但如實(shí)際參數(shù)是某個(gè)數(shù)組元素,那么因?yàn)閿?shù)組元素是一個(gè)變量,因此傳遞方法那么因?yàn)閿?shù)組元素是一個(gè)變量,因此傳遞方法與普通變量是一樣的,采用傳值的方式進(jìn)行,與普通變量是一樣的,采用傳值的方式進(jìn)行,函數(shù)中形式參數(shù)的變化不會影響對應(yīng)的實(shí)參的函數(shù)中形式參數(shù)的變化不會影響對應(yīng)的實(shí)參的數(shù)組元素。數(shù)組元素。 字符串實(shí)際上是內(nèi)存中一段連續(xù)的字節(jié)單元中字符串實(shí)際上是內(nèi)存中一段連續(xù)的字節(jié)單元中存儲的字符的總和,最后

24、用一個(gè)存儲的字符的總和,最后用一個(gè)0來標(biāo)志它的來標(biāo)志它的結(jié)束。前面已經(jīng)講解過字符串與字符數(shù)組是密切結(jié)束。前面已經(jīng)講解過字符串與字符數(shù)組是密切相關(guān)的,而數(shù)組又與指針密切相關(guān)的,因此字符相關(guān)的,而數(shù)組又與指針密切相關(guān)的,因此字符串與指針也密切相關(guān)。指向字符串的指針稱為字串與指針也密切相關(guān)。指向字符串的指針稱為字符串指針,其類型是符串指針,其類型是char *或或unsigned char *。實(shí)。實(shí)際上只要知道字符串的首地址的指針,那么就可際上只要知道字符串的首地址的指針,那么就可以通過移動(dòng)指針存取字符串的每一個(gè)字符,當(dāng)訪以通過移動(dòng)指針存取字符串的每一個(gè)字符,當(dāng)訪問到字符問到字符0時(shí)就是字符串的邊

25、界。因此可以用時(shí)就是字符串的邊界。因此可以用字符串指針來表示字符串。例如:字符串指針來表示字符串。例如:7.5 字符串與指針字符串與指針 char *s=”Hello”; 其中其中s就是一個(gè)字符串指針,在執(zhí)行該語句就是一個(gè)字符串指針,在執(zhí)行該語句時(shí)系統(tǒng)為時(shí)系統(tǒng)為”Hello”字符串分配字符串分配6個(gè)字節(jié)的空間,個(gè)字節(jié)的空間,同時(shí)把字符串的首地址既同時(shí)把字符串的首地址既H字符的地址賦值字符的地址賦值給給s指針變量。上述語句也可以寫成:指針變量。上述語句也可以寫成: char s=”Hello”; 用字符數(shù)組來存儲字符串時(shí),數(shù)組的指針用字符數(shù)組來存儲字符串時(shí),數(shù)組的指針就是字符串指針。通過就是字符

26、串指針。通過s指針可以訪問到任何指針可以訪問到任何一個(gè)字符單元,例如一個(gè)字符單元,例如i是一個(gè)整數(shù)下標(biāo),則是一個(gè)整數(shù)下標(biāo),則si與與*(s+i)是同一個(gè)元素,是同一個(gè)元素,&si與與s+i是同一個(gè)地是同一個(gè)地址,址,+s或或s可以使指針一次移動(dòng)一個(gè)字節(jié)單可以使指針一次移動(dòng)一個(gè)字節(jié)單元。元。 圖7-19 “Hello”的指針 字符串指針作為函數(shù)參數(shù)與普通的數(shù)組指字符串指針作為函數(shù)參數(shù)與普通的數(shù)組指針作為函數(shù)參數(shù)完全一樣,因?yàn)樽址羔槍?shí)針作為函數(shù)參數(shù)完全一樣,因?yàn)樽址羔槍?shí)際上也是字符數(shù)組的指針。應(yīng)用中不同的是在際上也是字符數(shù)組的指針。應(yīng)用中不同的是在普通數(shù)組作為函數(shù)參數(shù)時(shí)要同時(shí)向函數(shù)

27、傳遞數(shù)普通數(shù)組作為函數(shù)參數(shù)時(shí)要同時(shí)向函數(shù)傳遞數(shù)組的大小,但字符串指針作為函數(shù)參數(shù)傳遞字組的大小,但字符串指針作為函數(shù)參數(shù)傳遞字符串時(shí)由于字符串可以通過符串時(shí)由于字符串可以通過0的結(jié)束標(biāo)志來的結(jié)束標(biāo)志來判斷字符串的大小,因此不需要向函數(shù)傳遞字判斷字符串的大小,因此不需要向函數(shù)傳遞字符串的大小,只要傳遞字符串指針,在函數(shù)中符串的大小,只要傳遞字符串指針,在函數(shù)中就可以操作整個(gè)字符串了。就可以操作整個(gè)字符串了。 7.6 指針與二維數(shù)組指針與二維數(shù)組 指針數(shù)組就是數(shù)組的每一個(gè)元素都是一個(gè)指針數(shù)組就是數(shù)組的每一個(gè)元素都是一個(gè)指針變量,例如:指針變量,例如: int *p3; 則則p0、p1、p2這這3元

28、素都是整數(shù)指針。元素都是整數(shù)指針。 在二維數(shù)組中曾經(jīng)講到過二維數(shù)組是數(shù)組的數(shù)在二維數(shù)組中曾經(jīng)講到過二維數(shù)組是數(shù)組的數(shù)組,組, 例如:例如: int a34; 則則a0、a1、a2都是一位的數(shù)組,每個(gè)數(shù)組都是一位的數(shù)組,每個(gè)數(shù)組的元素個(gè)數(shù)是的元素個(gè)數(shù)是4,既然,既然a0、a1 、a2是一維是一維數(shù)組,因此它們也就是數(shù)組指針,既它們都是數(shù)組,因此它們也就是數(shù)組指針,既它們都是int*類型指針,類型指針, 換句話說可以:換句話說可以: p0=a0; p1=a1; p2=a2; 因此因此a0+0就是就是a00元素的指針元素的指針,a0+1是是a01元素的指針,元素的指針,a2+2是是a22元素的指元素

29、的指針,一般情況下,如針,一般情況下,如i(i=0,1,2)及)及j(j=0,1,2,3)是二維數(shù)組是二維數(shù)組a的下標(biāo)變量,則的下標(biāo)變量,則ai+j是是aij元素元素的指針,可以通過的指針,可以通過*(ai+j)來存取來存取aij元素。元素。 a是一個(gè)指針數(shù)組,有是一個(gè)指針數(shù)組,有3個(gè)指針元素,既個(gè)指針元素,既a0、a1、a2,而每一個(gè)指針數(shù)組都有,而每一個(gè)指針數(shù)組都有4個(gè)整數(shù)元個(gè)整數(shù)元素,素,a是一個(gè)是一個(gè)int (*)4類型的指針,既是一個(gè)指類型的指針,既是一個(gè)指針,該指針指向有針,該指針指向有4個(gè)整數(shù)的數(shù)組。個(gè)整數(shù)的數(shù)組。 設(shè)有二維數(shù)組:設(shè)有二維數(shù)組: int a34; 用它作為函數(shù)用它作為函數(shù)fun的參數(shù)可以寫成下列形式之一:的參數(shù)可以寫成下列形式之一: void fun(int a34,int m,int n); / 指定行數(shù)與列數(shù)指定行數(shù)與列數(shù) void fun(int a4,int m,int n); / 指定列數(shù)指定列數(shù) void fun(int (*a)4,int m,int n); / 指定指定a是一個(gè)指向有是一個(gè)指向有4個(gè)元素的整數(shù)數(shù)組的指針個(gè)元素的整數(shù)數(shù)組的指針 在用二維數(shù)組作函數(shù)參數(shù)時(shí),第一維的數(shù)值可以省在用二維數(shù)組作函數(shù)參數(shù)時(shí),第一維的數(shù)值可以省略,但第二維的數(shù)值不可以省略。

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論