C語言學(xué)習(xí)文檔之指針培訓(xùn)(PPT 29頁)_第1頁
C語言學(xué)習(xí)文檔之指針培訓(xùn)(PPT 29頁)_第2頁
C語言學(xué)習(xí)文檔之指針培訓(xùn)(PPT 29頁)_第3頁
C語言學(xué)習(xí)文檔之指針培訓(xùn)(PPT 29頁)_第4頁
C語言學(xué)習(xí)文檔之指針培訓(xùn)(PPT 29頁)_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、122.2.數(shù)據(jù)在內(nèi)存中的存儲方式數(shù)據(jù)在內(nèi)存中的存儲方式: : 按數(shù)據(jù)類型在內(nèi)存為其分配一定數(shù)量的按數(shù)據(jù)類型在內(nèi)存為其分配一定數(shù)量的存儲單元存儲單元( (字節(jié)字節(jié)) )。1.1.內(nèi)存單元的地址內(nèi)存單元的地址: : 計算機的內(nèi)存是以字節(jié)為單位的一片連續(xù)的計算機的內(nèi)存是以字節(jié)為單位的一片連續(xù)的存儲空間,每一個字節(jié)都有一個編號,這個存儲空間,每一個字節(jié)都有一個編號,這個編號就稱為內(nèi)存地址編號就稱為內(nèi)存地址3.3.內(nèi)存單元的內(nèi)容:內(nèi)存單元的內(nèi)容: 即變量的值。即變量的值。3例如有定義例如有定義: short int a,b; char c; float x; 變量變量a,b,c,x的內(nèi)存分配的內(nèi)存分配

2、情況情況:abxc200020012002200320042005200620072008 每個變量的地址是指該變量所占存儲單元的每個變量的地址是指該變量所占存儲單元的第一個字節(jié)的地址,稱為指針。第一個字節(jié)的地址,稱為指針。44. 4. 計算機中數(shù)據(jù)存取方式計算機中數(shù)據(jù)存取方式A A、變量的、變量的“直接訪問直接訪問”方式:方式: 按變量的地址存取變量值的方式。按變量的地址存取變量值的方式。( (見下圖見下圖) )i20003直接訪問直接訪問: :編譯器自動完成編譯器自動完成53i20002000pointer間接訪問方式示意圖間接訪問方式示意圖: 將將變量的地址變量的地址放在另一個特殊的變量

3、中,先到另放在另一個特殊的變量中,先到另一個變量所表示的存儲單元中取得變量的地址,再由一個變量所表示的存儲單元中取得變量的地址,再由變量的地址找到變量并進行數(shù)據(jù)存取變量的地址找到變量并進行數(shù)據(jù)存取( (見下圖見下圖) )。b.b.變量的變量的“間接訪問間接訪問”方式方式變量變量pointer為指針變量為指針變量, ,存放的是變量存放的是變量i i的的內(nèi)存地址內(nèi)存地址, ,我們說我們說pointer指向指向 i i。66.指針的概念:指針的概念:一個變量的首地址稱為該變量的指針。一個變量的首地址稱為該變量的指針。用來專門存儲用來專門存儲變量指針變量指針的變量稱為指針變量。的變量稱為指針變量。7一

4、一. . 指針變量的定義指針變量的定義1. 定義方式:定義方式: 類型標識符類型標識符 *指針變量名指針變量名1,*指針變量名指針變量名2 ;例:例:float *p1; (定義了定義了p1為指向?qū)嵭妥兞康闹羔樧兞繛橹赶驅(qū)嵭妥兞康闹羔樧兞? char *p2; (定義了定義了p2為指向字符型變量的指針變量為指向字符型變量的指針變量) 8 標識符前面的標識符前面的“* *”,表示該變量為指針,表示該變量為指針 變量。但指針變量名是變量。但指針變量名是* *后面的名字(不包后面的名字(不包括括“* *”)。)。3.3.說明說明2. 指針變量的指針變量的三三要素要素:v指針變量的指針變量的基類型基類

5、型: 和其所指變量的類型一致;和其所指變量的類型一致;v指針變量的指針變量的值值:另一個變量在內(nèi)存的地址;另一個變量在內(nèi)存的地址;v指針變量的指針變量的名字名字:符合用戶標識符規(guī)則。符合用戶標識符規(guī)則。 9指針變量名指針變量名=某一地址某一地址;.指針變量的賦值指針變量的賦值方式方式1: 指針變量名指針變量名=&變量名變量名;方式方式2: 指針變量名指針變量名=另一已經(jīng)賦值的指針變量另一已經(jīng)賦值的指針變量;方式方式3: 通過標準的庫函數(shù)(通過標準的庫函數(shù)(malloc和和calloc在內(nèi)存中開辟動態(tài)存儲在內(nèi)存中開辟動態(tài)存儲單元)單元)10i的地址的地址pi的值的值iqi的

6、地址的地址例如例如: int i,*p,*q; p=&i; /*方式方式1*/ q=p; /*方式方式2*/示示意意圖圖11說明:給指針變量賦說明:給指針變量賦“空空”值值除了給指針變量賦地址值外,還可以給指針變量賦除了給指針變量賦地址值外,還可以給指針變量賦NULLNULL值。值。如:如:p=Nullp=Null;NullNull是在是在stdio.hstdio.h頭文件中定義的預(yù)定義符。在使用前必須頭文件中定義的預(yù)定義符。在使用前必須使用預(yù)定義行:使用預(yù)定義行:#include #include 。NullNull的代碼值為的代碼值為0 0,當執(zhí)行以上賦值語句后,稱當執(zhí)行以上賦值語

7、句后,稱p p為空指針。等價于:為空指針。等價于:p=0 ; p=0 ; 或或 p=0p=0注意:這時指針注意:這時指針p p不是指向地址為不是指向地址為0 0的存儲單元,而是一個的存儲單元,而是一個具有一個確定的值具有一個確定的值“空空”。企圖通過一個空指針去訪問一。企圖通過一個空指針去訪問一個存儲單元,將會得到一個出錯信息。個存儲單元,將會得到一個出錯信息。121. 1.已知已知 int a=3, aint a=3, a的地址為的地址為10011001,則,則&a= &a= ?100110012. 2.設(shè)有定義:設(shè)有定義:float x; float x; 則以下對指針變量

8、則以下對指針變量p p進行定義且賦初值的語進行定義且賦初值的語句中正確的是:句中正確的是:a) float a) float * *p=1024; b) int p=1024; b) int * *p=(float)x; c) float p=&x d) float p=(float)x; c) float p=&x d) float * *p=&xp=&xD D134. 4.有以下程序段有以下程序段#include #include main()main() int n, int n,* *p=NULL;p=NULL; * *p=&n;p=&n

9、; scanf(“%d”,&p); scanf(“%d”,&p); printf(“%dn”,p); printf(“%dn”,p); 該程序試圖通過該程序試圖通過P P為變量為變量n n讀入數(shù)據(jù)并輸出,但程序有多出錯誤,讀入數(shù)據(jù)并輸出,但程序有多出錯誤,以下語句正確的是:以下語句正確的是: n, n,* *p=NULL b.p=NULL b.* *p=&n p=&n c.scanf(“%d”,&p) d.printf(“%dn”,p);c.scanf(“%d”,&p) d.printf(“%dn”,p);A A148.4.8

10、.4.對指針變量的操作對指針變量的操作1. 1.通過指針來引用一個存儲單元通過指針來引用一個存儲單元 C C語言提供了一個稱作語言提供了一個稱作“間接訪問運算符間接訪問運算符”( (間接運算符)的單目間接運算符)的單目運算符:運算符:“* *”,當指針變量有確切的地址值時,就可以通過間接,當指針變量有確切的地址值時,就可以通過間接訪問運算符引用該地址指向的存儲單元。訪問運算符引用該地址指向的存儲單元。如:如: int int * *p,i=10,j;p,i=10,j; p=&i; p=&i; j= j=* *p; p; 說明:把說明:把p p所指向的存儲單元(所指向的存儲單元(

11、i i)的值賦給)的值賦給j j,* *p p代表代表p p所指向的所指向的變量變量i i,以上語句等價于:,以上語句等價于: j=ij=i;15分析以下表達式的含義:分析以下表達式的含義:j=j=* *(&i); j=(&i); j=* *p+1;p+1;* *p=100; p=100; * *p+=1;p+=1;+* *p; (p; (* *p)+;p)+; int int * *p,i=10,j;p,i=10,j; p=&i; p=&i; j= j=* *p; p; 例子:例例子:例8.18.1162.算術(shù)運算算術(shù)運算(移動指針)移動指針) 例如例如: i

12、nt *p,i; char *q , c; p=&i;q=&c;.i10001001100220002001cpq.i10001001100220002001cpq / /* *運算示例運算示例* */ / p+;q+; 對指針進行加減運算時,數(shù)字對指針進行加減運算時,數(shù)字“1”1”不代表十進制整數(shù)不代表十進制整數(shù)“1”1”,即不是移動一個字節(jié),而是移動一個存儲單元長度。即不是移動一個字節(jié),而是移動一個存儲單元長度。17例如例如:右圖右圖1 pq為為假。假。.i10001001100220002001cpq.400040014002400340184019pqa0a1a9例如例

13、如:右圖右圖2int a10;int *p,*q;p=&a0; /*或或p=a;*/q=&a9;/*或或q=a+9;*/求求pq為真為假為真為假?2.比較運算比較運算18例例 main()int a,b;int *pointer_1,*pointer_2;a=100;b=10;pointer_1=&a;pointer_2=&b; printf (%d,%dn,a,b);printf(%d,%dn,*pointer_1,*pointer_2);程序運行結(jié)果:程序運行結(jié)果: 100,10 100,1019思考:思考:1.若已執(zhí)行了若已執(zhí)行了“pointer_1=&a

14、mp;a”,則:則: “&*pointer_1”的含意是什么?的含意是什么? (答:相當于答:相當于&a )2. *&a的含意是什么的含意是什么? (答:答:a )3. (*pointer_1)+相當于什么相當于什么? (答:答:a+ )20例例對輸入的兩個整數(shù)按大小順序輸出對輸入的兩個整數(shù)按大小順序輸出main()int *p1,*p2,*p,a,b;a=5;b=9;p1=&a;p2=&b;&a59p1p2&bab(1 初始初始)2 執(zhí)行執(zhí)行p=p1后后&a5p1a&b9p2b&apif (ab) p=p1;p1

15、=p2; p2=p; printf(a=%d,b=%dn,a,b); printf(max=%d,min=%dn,*p1,*p2);&b&b3 執(zhí)行執(zhí)行p2=p1后后&ap9p1p25ab4 執(zhí)行執(zhí)行p2=p后后5&a&b&a9pp1p2ab21-指向指針變量的指針指向指針變量的指針.定義形式定義形式: 類型類型 *變量名變量名;例如例如: int i,*p,*q; i=30; p=&i; q=&p;100020001000100120003000ipq 內(nèi)存示意圖內(nèi)存示意圖:指針的指針指針的指針22國家等級考試練習(xí):國家等級考試

16、練習(xí):1. 1.設(shè)有定義:設(shè)有定義:int n1=0,n2,int n1=0,n2,* *p=&n2,p=&n2,* *q=&n1,q=&n1,以下賦值語句中與以下賦值語句中與n2=n1;n2=n1;語句等價的是:語句等價的是:a. a. * *p=p=* *q; b.p=q c.q; b.p=q c.* *p=&n1 d. p=p=&n1 d. p=* *q qA A2. 2.若有說明語句:若有說明語句:double double * *p,a;p,a;則能通過則能通過scanfscanf語句正確給輸入語句正確給輸入項讀入數(shù)據(jù)的程序段是:項讀入

17、數(shù)據(jù)的程序段是:a. a.* *p=&a;scanf(“%lf”,p); b.p=&a;scanf(“%lf”,p); b.* *p=&a; scanf(“%f”,p);p=&a; scanf(“%f”,p);c.p=&a;scanf(“%lf”,c.p=&a;scanf(“%lf”,* *p); d.p=&a;scanf(“%lf”,p);p); d.p=&a;scanf(“%lf”,p);D D3. 3.已定義以下函數(shù)已定義以下函數(shù)int fun(int int fun(int * *p)p)return return * *

18、p;p;funfun函數(shù)的返回值是:函數(shù)的返回值是:a. a.不確定的值不確定的值 b. b.一個整數(shù)一個整數(shù) c. c.形參形參p p中存放的值中存放的值 d. d.形參形參p p的地址值的地址值 B B231. 1.形參為指針變量時實參和形參之間的數(shù)據(jù)傳遞形參為指針變量時實參和形參之間的數(shù)據(jù)傳遞 若函數(shù)的形參為指針類型,調(diào)用該函數(shù)時,對應(yīng)的實參必須是若函數(shù)的形參為指針類型,調(diào)用該函數(shù)時,對應(yīng)的實參必須是基類型相同的地址值或者是已指向某個存儲單元的指針變量?;愋拖嗤牡刂分祷蛘呤且阎赶蚰硞€存儲單元的指針變量。例例. .編寫函數(shù)編寫函數(shù)myadd(int myadd(int * *a,int

19、 a,int * *b),b),函數(shù)中把指針函數(shù)中把指針a a和和b b所指向的存儲所指向的存儲單元中兩個值相加,然后將和的值作為函數(shù)值返回。單元中兩個值相加,然后將和的值作為函數(shù)值返回。#include #include int myadd( int int myadd( int * *a,int a,int * *b)b) int sum; int sum; sum= sum=* *a+a+* *b; b; return sum; return sum; main()main() int x,y,z; int x,y,z; printf(“enter x,y:”); printf(“ent

20、er x,y:”);scanf(“%d%d”,&x,&y);scanf(“%d%d”,&x,&y);z=myadd(&x,&y);z=myadd(&x,&y);printf(“%d+%d=%dn”,x,y,z);printf(“%d+%d=%dn”,x,y,z); 思考:如果在被調(diào)函數(shù)中改變形參的值將如何呢?思考:如果在被調(diào)函數(shù)中改變形參的值將如何呢?242. 2.通過傳送地址值在被調(diào)用函數(shù)中直接改變調(diào)用函數(shù)中變量的值通過傳送地址值在被調(diào)用函數(shù)中直接改變調(diào)用函數(shù)中變量的值#include “stdio.h”#include “st

21、dio.h”Void s Void s * *,int ,int * *); );Void main()Void main() int x=30,y=20; int x=30,y=20; printf(“(1) x=%d y=%dn”,x,y); printf(“(1) x=%d y=%dn”,x,y); S); S); printf(“(4) x=%d y=%dn”,x,y); printf(“(4) x=%d y=%dn”,x,y); Void s Void s * *a,int a,int * *b)b) int t; int t; printf(“(2) a=%d b=%dn”, pr

22、intf(“(2) a=%d b=%dn”,* *a, a,* *b);b); t= t=* *a; a;* *a=a=* *b; b;* *b=t;b=t; printf(“(3) a=%d b=%dn”, printf(“(3) a=%d b=%dn”,* *a, a,* *b);b); 輸出結(jié)果:輸出結(jié)果:x=30 y=20 x=30 y=20a=30 b=20a=30 b=20a=20 b=30a=20 b=30(1)(1) (4) x=20 y=30(4) x=20 y=3025void s *x1,int *x2)void order(int *a,int *b)261. 一個函數(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論