




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第六章 指針 1、內(nèi)存:由存儲(chǔ)單元組成。其特點(diǎn)為:存儲(chǔ)單元是線性連續(xù)的。存儲(chǔ)單元的最小單位是 字節(jié)。2、內(nèi)存地址:正如我們的住房都有門牌號(hào)碼一樣,為了訪問(wèn)內(nèi)存中的某個(gè)存儲(chǔ)單元,我們也要為它編號(hào),這種編號(hào)稱為內(nèi)存地址。利用內(nèi)存地址我們可以訪問(wèn)該地址標(biāo)識(shí)的存儲(chǔ)單元。一、地址的相關(guān)基本概念:Byte3、首地址:程序中一旦定義了一個(gè)變量,該變量在內(nèi)存中就將占用一定的存儲(chǔ)單元。變量占用的存儲(chǔ)單元總是n(n0)個(gè)連續(xù)的字節(jié)。開始字節(jié)的地址,就是變量的地址也可稱為該變量存儲(chǔ)單元的首地址。二、指針與指針變量 從右圖可知,指針變量和一般變量一樣,僅僅是變量的內(nèi)容為變量地址的變量而已。指針變量pi 變量i 變量值
2、 變量地址(指針)變量地址存入指針變量指向這里變量和指針變量的類型必須一致。指針:一個(gè)變量的地址指針變量:專門存放變量地址的變量稱為指針變量 當(dāng)把變量的地址存入指針變量后,我們就認(rèn)為 這個(gè)指針指向了該變量。 指針變量的定義方式為: 數(shù)據(jù)類型名 * 指針變量名;定義指針時(shí)需要注意以下幾個(gè)問(wèn)題: int *prt1,*ptr2; float *q; char *c;三、指針變量的定義: 變量前面的“*”不能省略如果寫成:則表示 ptr2 被定義為整型變量而非整型指針變量。 int *prt1,ptr2; 定義中的“*”表示所定義的變量是指針變量。 指針變量名為 ptr1、ptr2 而非 * ptr
3、1、* ptr2。 指針變量定義后,變量值不確定,應(yīng)用前必須先賦值 指針變量只能指向定義時(shí)所規(guī)定類型的變量。關(guān)系到指針的 移動(dòng)和指針運(yùn)算。 一般而言,指針變量只能存放某一種數(shù)據(jù)類型的變量的地址,由此可將指針變量分為:整型指針變量、實(shí)型指針變量和字符型指針變量等等,指針變量的類型表明了其指向的存儲(chǔ)單元中存放的數(shù)據(jù)的類型。 int *prt1,*ptr2; float *q; char *c;即是說(shuō)該變量的值是不確定的,在引用該指針變量前,必須先讓它指向一個(gè)變量或在內(nèi)存中為其分配一個(gè)相應(yīng)的存儲(chǔ)單元。 取地址運(yùn)算符&的作用是取變量的地址。如:& i 表示求變量 i 的地址。 引用運(yùn)算符 * 的作用是
4、取指針指向變量的內(nèi)容。如: * ptr 表示求指針 ptr 所指向變量的內(nèi)容。& 運(yùn)算和 * 運(yùn)算是一對(duì)逆運(yùn)算。先對(duì)變量 i 作取地址運(yùn)算,其地址值賦給 point,point指針就已指向變量 i, *point的值為3。給*point 賦值相當(dāng)于給 i 賦值。1 、& 取地址運(yùn)算 * 引用運(yùn)算四、指針的“&”、“*”和賦值運(yùn)算:main( ) int i=3,*point; point=&i; printf(“*point=%d”,*point); *point=15; printf(“i=%d”,i); 2、指針的賦值運(yùn)算p=&a; (將變量a地址p)p1=p2; (指針變量p2值指針變量
5、p1)如: int a, *p; p=&a; 如 int a, *p1, *p2; p1=&a; p2=p1; 注意:指針的值為空時(shí),C語(yǔ)言中常用一符號(hào)常量NULL給其賦值。如: int *p; p=NULL; 指針的賦值運(yùn)算可以是以下兩種方式:把變量的地址值賦給指針變量;把一個(gè)指針的值賦給另一個(gè)指針。例子: 數(shù)組在內(nèi)存中占用連續(xù)的存儲(chǔ)單元。指針最常見的一種用途就是指向數(shù)組元素。當(dāng)一個(gè)指針指向數(shù)組元素后,就可以用它靈活、快速地處理數(shù)組元素,從而體現(xiàn)出指針的優(yōu)勢(shì)。main( ) int *ptr1,*ptr2,*ptr3; int ary5=2,4,8,16,32; ptr1=&ary0; pt
6、r2=&ary3; ptr3=ary; 五、指針和數(shù)組:(一)、指針和一維數(shù)組 C語(yǔ)言中規(guī)定數(shù)組名代表數(shù)組的首地址,即第一個(gè)元素的地址。因此 ptr3 = ary 等價(jià)于 ptr3 = &ary0 當(dāng)指針指向數(shù)組的首地址時(shí),指針可以象數(shù)組一樣使用。若指針ptr指向了數(shù)組ary的首地址,就有:*(ptr+2)、ptr2、ary2、*(ary+2)這四種形式都表示了數(shù)組的第三個(gè)元素。運(yùn)行結(jié)果: *(ptr+2)=5 ptr2=5 ary2=5 *(ary+2)=5#includemain( ) int *ptr; int ary5=2,9,5,45,3; ptr=ary; printf(“*(pt
7、r+2)=%dn”,*(ptr+2); printf(“ptr2)=%dn”,ptr2); printf(“ary2)=%dn”,ary2); printf(“*(ary+2)=%dn”,*(ary+2); 但是,指針變量與數(shù)組名有區(qū)別:指針變量是地址變量,數(shù)組名是地址常量。即是說(shuō)指針變量的內(nèi)容可以在程序運(yùn)行的過(guò)程中被改變,而數(shù)組名一旦被初始化,它的值就不能被改變了。main( ) int *ptr,i,ary10,bry10; ptr= &i; ptr= ary; ptr= bry; ary= &i; ary= bry; Example 1Example 2設(shè)數(shù)組Array有4個(gè)元素。2,4
8、,6,8。要求先順序打印數(shù)組中的各元素,然后逆序再打印一遍。(用數(shù)組實(shí)現(xiàn))設(shè)數(shù)組Array有4個(gè)元素。2,4,6,8。要求先順序打印數(shù)組中的各元素,然后逆序再打印一遍。(用指針實(shí)現(xiàn))#include main( ) int iArray4=2,4,6,8; int *iPoint; int iIndex; iPoint=iArray; for(iIndex=0;iIndex=0;iInedex-) printf( %d , ); printf(n);指針的簡(jiǎn)單例子(二)、指針的加減運(yùn)算:、指針與整型值的加減的結(jié)果是使該指針下移或上移整型值所指定個(gè)數(shù)的存儲(chǔ)單元后的地址。存儲(chǔ)單元的大小就是該指針的
9、數(shù)據(jù)類型所需的內(nèi)存大小。1、指針的加減運(yùn)算(+、-):指針的加減運(yùn)算有兩種形式一是指針與整型值的加減運(yùn)算;另一種是指針與指針的減運(yùn)算。、指針之間不允許加運(yùn)算。、指針之間的減運(yùn)算的含義是計(jì)算這兩個(gè)指針相差幾個(gè)存儲(chǔ)單元,其結(jié)果是一個(gè)整數(shù),可由下式計(jì)算:ptr1-ptr2=(ptr1的值-ptr2的值)/sizeof(指針的類型)2、指針的自加減運(yùn)算(+、-、+=、- =): + + 和 += 運(yùn)算是將指針下移一個(gè)或下幾個(gè)存儲(chǔ)單元; - - 和 -= 運(yùn)算是將指針上移一個(gè)或下幾個(gè)存儲(chǔ)單元。main( ) int *ptr; int ary5=2,4,6,8,10; ptr=ary; ptr+=3;
10、ptr-; ptr-=2; ptr+; main( ) int *ptr1,*ptr2,x; int ary5=2,4,6,8,10; ptr1=ary; ptr2=ptr1+3; x=ptr2-ptr1; (三)、字符指針與字符串:main( ) char string =“Hell0”; printf(“%sn”,string); main( ) char *string=“Hello”; printf(“%sn”,string); 字符H的地址字符H的地址stringchar *string=“Hello”; char *string ;string = “Hello”;stringHe
11、llo0字符數(shù)組和字符指針的使用區(qū)別:1、兩者中存放的內(nèi)容不同;stringstring字符H的地址char string10;string = “Hello!”; char *string;string = “Hello!”; 2、賦值的方法不同:3、指針變量的值是可以改變的,而數(shù)組名是常量。char *s,a =“China”,b =“hello”;s=a;b=s; b=a; Example 3字符型數(shù)組和字符型指針的區(qū)別附 :函數(shù)的定義、聲明、調(diào)用 C程序的執(zhí)行從main函數(shù)開始,若在main中調(diào)用其它函數(shù),在調(diào)用結(jié)束后流程回到main函數(shù)。函數(shù)聲明函數(shù)調(diào)用函數(shù)定義1、指針變量作為函數(shù)參
12、數(shù) 1)指針作為函數(shù)的參數(shù),可改變參數(shù)的值。 2)用數(shù)組名(或指向數(shù)組的指針)作為函數(shù)的參數(shù), 可傳遞大量數(shù)據(jù)。六、指針和函數(shù)Example 4 請(qǐng)細(xì)心比較假設(shè)有兩個(gè)數(shù)a和b,初始時(shí)a=100,b=200,請(qǐng)編寫程序?qū)崿F(xiàn)兩個(gè)數(shù)據(jù)的交換。void swap(int p1,int p2);main( ) int a,b; a=100;b=200; printf(”a_old=%d,b_old=%d,a,b); swap(a,b); printf(”na_new=%d,b_new=%d,a,b); void swap(int p1,int p2) int temp; temp=p1; p1=p2;
13、p2=temp; void swap(int *p1,int *p2);main() int a,b; a=100;b=200; printf(”a_old=%d,b_old=%d,a,b); swap(&a,&b); printf(”na_new=%d,b_new=%d,a,b); void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; Result First Program of Example4運(yùn)行結(jié)果: a_old=100,b_old=200 a_new=100,b_new=200Result First P
14、rogram of Example4運(yùn)行結(jié)果: a_old=100,b_old=200 a_new=200,b_new=100 2、返回指針值的函數(shù)類型名 *函數(shù)名(形參表) 函數(shù)體 return 地址值; 1)定義形式2)調(diào)用形式int *funa(int x,int y) 函數(shù)體 return 地址值; 例:Example 5假設(shè)有一個(gè)包含6個(gè)元素的整型數(shù)組,編寫程序找到該數(shù)組中最大元素和最小元素,并打印出來(lái)。(用返回指針值的函數(shù)實(shí)現(xiàn))int *arr (int a6) int b2,i; b0=b1=a0; for(i=0;iai) b0=ai; if(b1ai) b1=ai; retu
15、rn b;main()int a6=3,5,2,34,12,8; int *p; p=arr(a); printf(“%d,%d”, *p, *(p+1);例:求數(shù)組中的最小數(shù)和最大數(shù)int *arr(int a6) int i,*b; b=malloc(2*sizeof(int); b0=b1=a0; for(i=0;iai) b0=ai; if(b1ai) b1=ai; return b;main()int a6=3,5,2,34,12,8; int *p; p=arr(a); printf(“%d,%d”, *p, *(p+1);例:求數(shù)組中的最小數(shù)和最大數(shù) # include p =
16、malloc( sizeof (elemtype) ; free(p); p= new (sizeof(elemtype) Delete p; p= new (n*sizeof(elemtype) Delete p;內(nèi)存的動(dòng)態(tài)分配及回收Example 6 假設(shè)有一個(gè)指針,其地址存放1024個(gè)整數(shù),編寫程序,求以該指針為起始地址的1024個(gè)單元數(shù)據(jù)的和,并打印出來(lái)。void main() int * ipSample=NULL; int iSum=0; int iIndex; ipSample=new int 1024; for (iIndex=0;iIndex1024;iIndex+) ipS
17、ampleiIndex=iIndex+1; for (iIndex=0;iIndex1024;iIndex+) iSum+=ipSampleiIndex; printf(“iSum=%d”,iSum); delete ipSample; 七、指向指針的指針(二級(jí)指針)例 int i=3; int *p1; int *p2; p1=&i; p2=&p1; *p2=5;二級(jí)指針:指針變量中存放一級(jí)指針變量的地址一級(jí)指針:指針變量中存放目標(biāo)變量的地址ip1p23&i&p1p2&p1&i3p1(指針變量)i(整型變量)5Example 7二級(jí)指針的用法示例#include#includeint mai
18、n() int *p; int n=3,m=4; int I, j;p=(int*)malloc(4*sizeof(int *); for(i=0;im;i+)*(p+i)=(int*)malloc(3*sizeof(int); for(i=0;i4;i+)for(j=0;j3;j+) *(*(p+i)+j)=(i+1)*(j+1); printf(%dt,*(*(p+i)+j);printf(n);for(j=0;jnum=20;p+;p-age=18;2018p&stu0&stu1例: typedef struct char name20; int age; char sex; stude
19、nt; student stu1,stu2; typedef :聲明新的類型名來(lái)代替已有類型名struct student char name20; int age; char sex; ; struct student stu1,stu2; 例 :typedef int integer; integer a , b ; struct student int num; char name20; char sex; int age; ;struct student stu3;struct student *p;p=stu;p-num=20;p+;p-age=18;typedef struct int num; char name20; char sex; int age; student ; student stu3;student *p;p=st
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025屆河北省張家口市高三上學(xué)期期末質(zhì)量檢測(cè)地理試題及答案
- 2025年度專業(yè)車庫(kù)租賃權(quán)轉(zhuǎn)讓合同
- 2025年度農(nóng)村土地承包經(jīng)營(yíng)權(quán)流轉(zhuǎn)與農(nóng)業(yè)文化遺產(chǎn)保護(hù)合同
- 2025年度中小企業(yè)流動(dòng)資金授信借款合同
- 2025年度城市河道治理房屋拆遷補(bǔ)償合同
- 2025年度人才共享與借用項(xiàng)目合作協(xié)議
- 2025年度協(xié)商解除勞動(dòng)合同與員工住房安置合同
- 2025年度公司銷售業(yè)務(wù)員協(xié)議書:人工智能賦能下的銷售代理合同
- 2025年度子女對(duì)父母贍養(yǎng)及社區(qū)互助保障協(xié)議
- 化妝品店裝修合同
- 小學(xué)奧數(shù)七大模塊思維導(dǎo)圖課件
- 火力發(fā)電廠OVATION 與西門子控制系統(tǒng)之間通訊實(shí)現(xiàn)
- 2022公務(wù)員錄用體檢操作手冊(cè)(試行)
- 我長(zhǎng)大以后【經(jīng)典繪本】
- 2023學(xué)年完整公開課版閘閥
- 中國(guó)濕疹診療指南
- 國(guó)家電網(wǎng)有限公司電網(wǎng)數(shù)字化項(xiàng)目工作量度量規(guī)范應(yīng)用指南(2020版)
- 電子商務(wù)文案寫作教學(xué)ppt課件(完整版)
- JJF 1445-2014落錘式?jīng)_擊試驗(yàn)機(jī)校準(zhǔn)規(guī)范
- GB/T 36663-2018船舶和海上技術(shù)船舶系泊和拖帶設(shè)備閉式導(dǎo)纜孔
- GB/T 3077-2015合金結(jié)構(gòu)鋼
評(píng)論
0/150
提交評(píng)論