版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第十章,指針,10.1地址和指針的概念,內(nèi)存區(qū)的每一個(gè)字節(jié)有一個(gè)編號(hào),這就是“地址” 。,地址:,又叫“指針”,int型變量i的值是3,地址是2000;有一個(gè)指針ipointer,值為2000;那么這個(gè)ipointer就指向以其值2000為地址的內(nèi)存單元,即,指向變量i,如果有一個(gè)變量專門用來存放另一變量的地址(即指針),則它稱為“指針變量”。 i_pointer就是一個(gè)指針變量。,指針變量:,這種變量的值是某變量的地址,可以指向以該值為地址的單元 類型是一個(gè)指針,指針變量除了類型是指針外,會(huì)不會(huì)涉及其它類型? 指針變量需不需要區(qū)分究竟它所指向的內(nèi)存單元中的數(shù)據(jù)是什么類型的? 之所以要用指針變
2、量,就是希望能夠通過它直接訪問某個(gè)內(nèi)存單元中的數(shù)據(jù),既然要訪問這些數(shù),必然涉及到這些數(shù)的操作,既然有操作,必然和類型相關(guān)。所以定義指針型變量時(shí),必須指明該指針變量所指向的內(nèi)存單元中數(shù)據(jù)的類型,10.2 變量的指針和指向變量的指 針變量,10.1 定義一個(gè)指針變量,要定義一個(gè)指針變量,要指明兩種類型,一種是指針型,一種是所指向的單元中數(shù)據(jù)的類型 基本格式為 所指向的數(shù)據(jù)類型 *指針變量名 如 int *i_point; float *f_point_a; char *c_point1;,在定義指針變量時(shí)要注意兩點(diǎn):,指針變量前面的“*”,表示該變量的類型為指針型變量。 例: float *poi
3、nter_1; 指針變量名是pointer_1 ,而不是* pointer_1 。,(2) 在定義指針變量時(shí)必須指定基類型。 只有整型變量的地址才能放到指向整型變量的指針變量中。 float a; int * pointer_1; 想將變量a的地址賦給指針變量pointer_1是錯(cuò)誤的,10.2.2 指針變量的引用,給它賦值 ,用賦值語句使一個(gè)指針變量得到另一個(gè)變量的地址,從而使它指向一個(gè)該變量。 例如: pointer_; pointer_;,從它取值 *指針運(yùn)算符,表示緊跟在其后的那個(gè)指針變量所指向的內(nèi)存單元 *指針變量名 如,*i_point, j=*i_point;,注意:,指針變量只
4、有賦值后才能使用,使用沒有被賦值的指針變量會(huì)很危險(xiǎn),有可能造成系統(tǒng)癱瘓 給指針變量賦值時(shí),一定要注意類型的一致 可將一個(gè)已賦值的指針賦給另一個(gè)同類型的指針,如:int a,*p,*q; p=,例10. 通過指針變量訪問整型變量,#include voidmain ( ) int ,; int *pointer_, *pointer_; ; pointer_; /*把變量的地址賦給 pointer_1 */ pointer_; /*把變量的地址賦給 pointer_ */ printf(%,%,); printf(%,%,*pointer_, *pointer_); ,對(duì)“”和“*”運(yùn)算符說明:
5、 如果已執(zhí)行了語句 pointer_; (1)* pointer_的含義是什么?,“”和“*”兩個(gè)運(yùn)算符的優(yōu)先級(jí)別相同,但按自右而左方向結(jié)合。因此,* pointer_與相同,即變量a的地址。 * pointer_與pointer_等價(jià)。 如果有pointer_2 * pointer_ ;它的作用是將(的地址)賦給pointer_2 ,如果pointer_2原來指向,經(jīng)過重新賦值后它已不再指向了,而指向了。,(2) *的含義是什么?,(3) (*pointer_)相當(dāng)于。,*point_1+ 相當(dāng)于 *(point_1+) 求出point_1所指向的單元中的值,然后point_1中的地址增1個(gè)
6、單位(根據(jù)指針類型決定單位字節(jié)數(shù)),先進(jìn)行運(yùn)算,得的地址,再進(jìn)行*運(yùn)算。*和*pointer_的作用是一樣的,它們都等價(jià)于變量。即*與等價(jià)。,例10 . 2 輸入和兩個(gè)整數(shù),按先大后小的順序輸出 和。,#include void main() int *1,*2,*,; scanf(,); 1; if() ; printf(=,=,); printf(max=,min=,*1,*2); ,運(yùn)行情況如下: , , ,,指針可以作為函數(shù)的形參和實(shí)參傳址調(diào)用。 若將存放變量的地址傳給被調(diào)函數(shù),被調(diào)函數(shù)的形參必須是指針型變量。 在被調(diào)函數(shù)中可以通過間接訪問的方式得到或修改實(shí)參的內(nèi)容。 這種方法使數(shù)據(jù)傳
7、輸安全可靠,而且可以實(shí)現(xiàn)多個(gè)數(shù)據(jù)的雙向傳遞。,10.3 指針變量作為函數(shù)參數(shù),#include void swap(int,int); void main( ) int a,b; a=2,b=6; if (ab) swap(a,b); printf(“%d,%d”,a,b); ,void swap(int x, int y) int temp; temp=x; x=y; y=temp; /printf(“%d,%d”,x,y); ,例10 . 3 對(duì)輸入的兩個(gè)整數(shù)按大小順序輸出,#include void main() void swap(int *p1,int *p2); int a,b;
8、int *pointer_1,*pointer_2; a=5;b=9; pointer_1= ,void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; ,*1,返回值方式,但只能返回一個(gè)值。 使用全局變量,可以傳遞多個(gè)值,但是不安全。 傳址調(diào)用,可以傳遞多個(gè)值,而且安全。,函數(shù)間數(shù)據(jù)“雙向”傳遞的方法:,10.3 數(shù)組與指針,數(shù)組元素的指針就是數(shù)組元素的地址。 數(shù)組的指針就是數(shù)組的首地址,例如: ; *;,10.3.1 指向數(shù)組元素的指針,一維數(shù)組名表示數(shù)組的首地址。(或用 while(*p) p+; printf(T
9、he string length is %dn,p-s); ,運(yùn)行結(jié)果如下: The string length is 7,10.3 用數(shù)組名作函數(shù)參數(shù),void main() (int arr,int ); int array; (array,); int (int arr,int ) ,實(shí)參是一維數(shù)組名,即一維數(shù)組的首地址。 形參應(yīng)為與實(shí)參數(shù)組同數(shù)據(jù)類型的數(shù)組或指針變量,例10 將數(shù)組中個(gè)整數(shù)按相反順序存放。,#include void main() void inv(int ,int ); int , ,; printf(The original array:); for(;) prin
10、tf (,); printf(); inv (,); printf(The array has been in verted:); for(;) printf (,); printf (); ,void inv(int ,int ) /*形參x是數(shù)組名*/ int temp,(); for(;) ; temp; ; temp; return; ,#include void main() void inv(int *,int ); int , ,; printf( The original array: ); for(;) printf (,); printf (); inv(,); print
11、f ( The array has been in verted: ); for(;) printf (,); printf ();,對(duì)剛才的程序可以作一些改動(dòng)。將函數(shù)inv中的形參改成指針變量。,void inv(int *,int ) /*形參x為指針變量*/ int,temp,*,*,(); ; for(;,) temp*; *; *temp; return; ,如果有一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組中的元素的值,實(shí)參與形參的對(duì)應(yīng)關(guān)系有以下種情況:,(1) 形參和實(shí)參都用數(shù)組名,如: void main() void (int ,int ) int ; (,); ,(2) 實(shí)參用數(shù)組名
12、,形參用指針變量。如: void () void (int *,int ) int ; (,); ,(3)實(shí)參形參都用指針變量。例如: void main() void (int *,int ) int , *p=a; (p,); ,(4) 實(shí)參為指針變量,形參為數(shù)組名。如: void main() void (int x ,int ) ,*p=a; (p,); ,#include void main() void inv(int *,int ); int ,*; printf(The original array:n ); for(;,) scanf(,); printf(); ; inv(
13、,); /* 實(shí)參為指針變量 */ printf(The array has been inverted :); for(; ) printf(,*); printf(); ,void inv(int *,int ) int ,temp,*,*; (); ; for(;,) emp*;*;*temp; return; ,例109 用選擇法對(duì)個(gè)整數(shù)按由大到小順序排序。,#include void main() void sort(int x ,int n); int *p,i,a10; p=a; for(i=0;i10;i+) scanf(%d,p+); p=a; sort(p,10); for
14、(p=a,i=0;i10;i+) printf(%d,*p);p+; ,void sort(int x ,int n) int i,j,k,t; for(i=0;ixk) k=j; if(k!=i) t=xi; xi=xk; xk=t; ,*(xj),*(xk),10. 字符串與指針,10.4.字符串的表示形式,例 10.5 定義一個(gè)字符數(shù)組,對(duì)它初始化, 然后輸出該字符串,#include void main() char stringI love China!; printf(,string); ,(1) 用字符數(shù)組存放一個(gè)字符串,然后輸出該字符串。,(2) 用字符指針指向一個(gè)字符串。 可
15、以不定義字符數(shù)組,而定義一個(gè)字符指針。用字符指針指向字符串中的字符。,例106 定義字符指針 #include void main() char *string= I love China!; printf(%sn,string); ,char *string; scanf(%s,string);,X,例10.7 將字符串復(fù)制為字符串。,#include void () char am a boy,20; int ; for(;*()??;) *()*(); *(); printf(string a is :,); printf(string b is:); for(;?。唬?printf(,)
16、; printf(); ,b=ai,puts(b),也可以設(shè)指針變量,用它的值的改變來指向字符串中的不同的字符。,例10.8 用指針變量來處理例107問題。,#include void main() char =I am a boy. ,20,*p1,*p2; int ; ; for(;*??;p1,p2) *;,*; printf(string is:,); printf( :); for(;?。唬?printf(,); printf(); ,程序必須保證使和同步移動(dòng),10.4.2 字符指針作函數(shù)參數(shù),實(shí)參:數(shù)組名、字符指針變量 形參:數(shù)組名、字符指針變量,(1) 字符數(shù)組由若干個(gè)元素組成,每
17、個(gè)元素中放一個(gè)字符,而字符指針變量中存放的是地址(字符串第1個(gè)字符的地址),決不是將字符串放到字符指針變量中。 (2)賦值方式。對(duì)字符數(shù)組只能對(duì)各個(gè)元素賦值,不 能用以下辦法對(duì)字符數(shù)組賦值。 char str14; str=“I love China!”; 而對(duì)字符指針變量,可以采用下面方法賦值: char *; =“ I love China!”;,10.4.3 對(duì)使用字符指針變量和字符數(shù)組的討論,字符數(shù)組和字符指針變量二者之間的區(qū)別:,(3)對(duì)字符指針變量賦初值: char * love China??;等價(jià)于 char *; I love Chian?。?而對(duì)數(shù)組的初始化: char st
18、r love China!; 不能等價(jià)于 char str; str I love China!;,(4) 定義了一個(gè)字符數(shù)組,在編譯時(shí)為它分配內(nèi)存單元,它有確定的地址。而定義一個(gè)字符指針變量時(shí),給指針變量分配內(nèi)存單元,在其中可以放一個(gè)字符變量的地址。,例如: char str; scanf(,str);,(5) 指針變量的值是可以改變的,10.7 指針數(shù)組和指向指針的指針,10.7.1 指針數(shù)組的概念,一個(gè)數(shù)組,若其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組,也就是說,指針數(shù)組中的每一個(gè)元素都相當(dāng)于一個(gè)指針變量。 一維指針數(shù)組的定義形式為: 類型名 *數(shù)組名數(shù)組長(zhǎng)度; 例如: char *;,例10
19、.6 將若干字符串按字母順序(由小到大)輸出。,#include #include void main() void sort(char *name,int n); void print(char *name,int n); char *name=Follow me,BASIC,Great Wall,FORTRAN,Computer design; int n=5; sort(name,n); print(name,n); ,void sort(char *name,int n) char *temp; int i,j,k; for(i=0;i0) k=j; if(k!=i) temp=nam
20、ei; namei=namek; namek=temp; ,void print(char *name,int n) int i; for(i=0;in;i+) printf(%sn,namei); ,運(yùn)行結(jié)果為: Computer design FORTRAN Follow me Great Wall,10.7.2 指向指針的指針,定義一個(gè)指向指針數(shù)據(jù)的指針變量: *; 根據(jù)“ * ”運(yùn)算符的結(jié)合性,*相當(dāng)于*(*) *是指針變量的定義形式,定義了一個(gè)指向字符數(shù)據(jù)的指針變量。 前面又有一個(gè)*號(hào):表示指針變量是指向一個(gè)字符指針變量的。*就是所指向的另一個(gè)指針變量。,例10.7 使用指向指針的指針。,#include void main() char *name=Follow me,BASIC,Great Wall,F(xiàn)ORTRAN,Computer design; char *; int ; for(;) ; printf(,*); ,例10.28 一個(gè)指針數(shù)組的元素指向整型數(shù)據(jù)的簡(jiǎn)單例子。,#include void main() int ,; int *num5= printf(%sn,*argv); -argc; ,在DOS命令狀態(tài)下輸入的命令行為 則執(zhí)行以上命令行將會(huì)輸出以下信息: ,10.8有關(guān)指針的數(shù)據(jù)類型和 指針運(yùn)算的小結(jié),10.8.1有關(guān)指針的數(shù)據(jù)類
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年掃地機(jī)器人OTA用戶調(diào)研
- 2026年金融交易中資金誤操作的糾正方法試題
- 2026年金融投資風(fēng)險(xiǎn)管理題庫(kù)穩(wěn)健收益的保障措施
- 2026年旅游規(guī)劃師景區(qū)規(guī)劃中級(jí)考試模擬題
- 2026年河北省承德市單招職業(yè)傾向性考試題庫(kù)附答案
- 2026年大數(shù)據(jù)分析專家金融行業(yè)考試練習(xí)題
- 2026年人工智能領(lǐng)域?qū)I(yè)知識(shí)題庫(kù)與答案解析
- 2026年科技金融產(chǎn)品創(chuàng)新與基金設(shè)計(jì)試題集
- 2026年外貿(mào)業(yè)務(wù)英語交流能力專項(xiàng)測(cè)試題
- 2026年環(huán)境保護(hù)法律法規(guī)知識(shí)題庫(kù)
- 壓縮空氣儲(chǔ)能系統(tǒng)地下人工硐室技術(shù)及其評(píng)價(jià)技術(shù)研究
- 餐具分揀裝置的設(shè)計(jì)(機(jī)械工程專業(yè))
- 高考英語核心詞匯中英對(duì)照手冊(cè)
- 創(chuàng)傷性血?dú)庑氐淖o(hù)理常規(guī)
- 廣東省交通建設(shè)工程從業(yè)人員實(shí)名制管理系統(tǒng)
- 代簽手術(shù)免責(zé)協(xié)議書范本
- 礦場(chǎng)車隊(duì)管理方案(3篇)
- 百萬英鎊課件
- 浙江省金麗衢十二校2025屆高三下學(xué)期二模英語試題 含解析
- 售后部門經(jīng)理年終述職報(bào)告
- 機(jī)加工風(fēng)險(xiǎn)辨識(shí)評(píng)估報(bào)告
評(píng)論
0/150
提交評(píng)論