第八章指針教程文件_第1頁
第八章指針教程文件_第2頁
第八章指針教程文件_第3頁
第八章指針教程文件_第4頁
第八章指針教程文件_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章指針及其應用本章主要內(nèi)容指針的定義和引用指針與數(shù)組字符指針和字符串8.1指針與指針變量8.1.1指針的基本概念

就像同學與所住宿舍號碼的關系指針是一種變量,在定義的同時可以賦給它初始值,稱為指針的初始化。形式如下:

類型標識符 *指針名=初始地址值;例如,int m,n[8];charc;int*pm=&m;int*pn=n;char*pc=&c;8.1.3指針的初始化

變量地址作初值時,該變量在此之前已說明過,且類型應一致。可用已賦初值的指針去初始化其他指針變量定義:例:inti;int*i_pointer;引用:i=3*i_pointer=3&i_pointer=3010i_pointer=20002000i_pointer3*i_pointeri2000內(nèi)存用戶數(shù)據(jù)區(qū)變量i變量j變量

i_pointer362000200020023010#include“stdio.h”main(){intvar;int*p_var;p_var=&var;var=8888;printf("%d\n",var);printf("%d\n",*p_var);printf(“%x\n”,&var);printf(“%x\n”,p_var);printf(“%x\n”,&p_var);}“*”指針運算符,表示“指向”“&”地址運算符intn,*i_point;i_point=&n;&(*i_point)等效于i_point*(&n)等效于n8.1.4指針運算符

應區(qū)分i_point、*i_point和&i_point三者的區(qū)別:

i_point:是指針變量,其內(nèi)容是地址量*i_point:是指針變量的目標變量

&i_point:是指針變量本身所占據(jù)的存儲地址內(nèi)存用戶數(shù)據(jù)區(qū)變量i變量j變量

i_pointer362000200020023010i=3*i_pointer=3i_pointer=2000&i_pointer=30108.1.5指針的運算

賦值

關系算術指針運算與整數(shù)的加減運算、加1和減1運算、指針相減運算

在指向相同數(shù)據(jù)類型的指針之間進行,但指針可以和0進行比較,用以判斷是否為空指針必須用地址常量或變量賦值,不能是普通整數(shù)。

但賦0值,表示空指針(1)指針與整數(shù)的加、減運算

指針point加上或減去一個整數(shù)n,將相對于當前位置前移或后移n個存儲單元。int*pn;不妨設pn=0x0000,那么pn+n=pn+n*sizeof(int)=0x0000+n*2(2)指針加1和減1運算

指針的加1和減1運算,只是指針與整數(shù)的加減運算的特例,例如:int*pn,n,m;pn=&n;m=*pn++; //先賦值再自加(3)指針相減運算

同類型的指針變量p1和p2相減,是指針間數(shù)據(jù)的個數(shù),不是兩指針間的字節(jié)數(shù)。例如:Type*p1,*p2那么有:p2-p1=(p2-p1)/sizeof(Type)【例】使用指針將兩個整數(shù)交換順序#include"stdio.h"main(){intm,n,*pm,*pn,temp;pm=&m;pn=&n;scanf("%d%d",&m,&n); temp=*pm;*pm=*pn;*pn=temp;printf("%d,%d\n",m,n);printf("%d,%d\n",*pm,*pn);}在引入指針運算后,數(shù)據(jù)交換可通過指針所指向的存儲地址進行操作

m和n的值改變了嗎?例:輸入3個數(shù),由大到小排序輸出main(){inta,b,c,*pa,*pb,*pc;scanf("%d,%d,%d",&a,&b,&c);pa=&a;pb=&b;pc=&c;

exchange(pa,pb,pc);printf("%d,%d,%d\n",a,b,c);

printf("%d,%d,%d\n",*pa,*pb,*pc);}exchange(int*q1,int*q2,int*q3){if(*q1<*q2)swap(q1,q2);if(*q1<*q3)swap(q1,q3);if(*q2<*q3)swap(q2,q3);}swap(int*a,int*b){intp;p=*a;*a=*b;*b=p;}8.2指針與數(shù)組

數(shù)組名是數(shù)組在內(nèi)存中的首地址,且數(shù)組的元素在內(nèi)存中占用連續(xù)的一片存儲空間,因此,可用指針訪問數(shù)組元素floatx[10],*px;//定義數(shù)組和指針px=x;或px=&x[0];//指針指向數(shù)組8.2.1指向一維數(shù)組的指針

訪問數(shù)組元素方法:偏移量法,如:*(px+2)//px值不變指針移動法,如:px++//px值變化x++是不允許的,因為數(shù)組名是常量*px就是x[0],*(px+i)就是x[i]。x[i],*(px+i),*(x+i)都是等效的【例】使用指針對數(shù)組元素進行輸入輸出#include<stdio.h>voidmain(){floatdata[5],*pf=data;intk;for(k=0;k<5;k++) scanf("%f",pf+k);

for(k=0;k<5;k++){printf("%f",*pf);pf++;}for(k=0;k<5;k++)printf("%f,",*(pf+k)); }

scanf("%f",pf++);區(qū)別?pf=data;【例】將數(shù)組中的元素逆順存放#include<stdio.h>voidmain(){intdata[7]={1,2,3,4,5,6,7},temp,k,*ph,*pt;ph=data;pt=data+6;while(pt>ph){temp=*ph;*ph=*pt;*pt=temp;ph++;pt--;}//兩指針向中間移動for(k=0;k<7;k++)printf("%d,",*(data+k));}ijii-1…jj-1…指向由m個元素組成的一維數(shù)組的指針變量例:staticinta[4]={1,2,3,4};int(*p)[4],i,j;p=a;int(*p)[4]表明p是一個指針變量,它指向包含4個元素的一維數(shù)組,若寫成*p[4],則表明是指針數(shù)組(以后再講)8.2.2指向多維數(shù)組的指針

(1)二維數(shù)組的指針假設有如下數(shù)組:inta[3][4]={{1,3,5,7},{9,11,13,15}{17,19,21,23}}a[0][0]a[0][2]a[1][2]a[1][3]a[0][3]a[2][3]a[2][0]a[1][1]a[2][1]a[2][2]a[1][0]a[0][1]aa+1a+2(2000)(2008)(2016)a[0]+1第二行首地址,即a[2]的首地址第一行首地址,即a[1]首地址第零行首地址,即數(shù)組的首地址aa+1a+2a[0]:第0行第0列元素的地址,即&a[0][0]a[1]:第1行第零列元素的地址,即&a[1][0]a[2]:第2行第零列元素的地址,即&a[2][0]a[0]+1:第0行第1列地址是&a[0][1]a[1]+2:第1行第2列地址是&a[1][2]a[1]+2=>*(a+1)+2=>&a[1][2]----不能寫成*(a+1+2)【例】用指針變量輸出數(shù)組元素的值

#include"stdio.h"voidmain(){staticinta[3][4]={{1,2,3,4}, {5,6,7,8},{9,10,11,12}};int*p,i,j,n;n=sizeof(a)/sizeof(int);for(p=a[0];p<a[0]+n;p++) printf("%d,",*p);}

例:求成績的平均值(二維數(shù)組做函數(shù)參數(shù))#include“stdio.h”voidaverage(float*p,intn){float*p_end=p+n-1,sum=0,aver;for(;p<=p_end;p++)sum=sum+(*p);aver=sum/n;printf("average=%5.2f\n",aver);}main(){staticfloatscore[3][4]={{60,61,62,63}, {70,71,72,73},{80,81,82,83}};average(score,12);}在定義的同時進行初始化例如:char*p=”astring”;

8.3字符指針和字符串

末尾自動加‘\0’,標志結(jié)束,不計入總長度利用賦值語句初始化char*s;s=“string”;

兩種初始化的方法【例】使用指針編寫程序,比較兩個字符串的大小(不使用字符串處理函數(shù))步驟:定義兩個指向字符串的指針通過移動指針進行逐字符比較如有字符串ABCdEF和ABCDEF,則認為ABCdEF比ABCDEF大原因:前3個字符一樣,第4個字符d的ASCII值比D的ASCII值大#include<stdio.h>voidmain(){charstr1[50],str2[50];char*ps1=str1,*ps2=str2; scanf("%s",ps1);scanf("%s",ps2);while(*ps1!='\0'&&*ps2!='\0'){if(*ps1!=*ps2) //不等時跳出循環(huán) break;ps1++; ps2++; //指針后移}if(*ps2>*ps1) printf("string1<string2\n");elseif(*ps2<*ps1) printf("string1>string2\n");elseprintf("string1=string2\n");}【例7】使用指針編程,進行字符串復制#include<stdio.h>voidmain(){chara[]="TsinghuaUniversity",b[30];inti,j;for(i=0;*(a+i)!='\0';i++)*(b+i)=*(a+i); //逐個字符復制*(b+i)='\0'; //加截止符printf("Stringais:%s\n",a);for(i=0;b[i]!='\0';i++)printf("%c",b[i]);//逐個字符輸出}字符指針變量與字符數(shù)組的區(qū)別字符數(shù)組 字符指針變量1.數(shù)組單元存放一個字符2.對字符數(shù)組賦值要用Staticcharstr[]={“Tsinghua”}3.對字符數(shù)組只能對各個元素賦值。

不能用charstr[20];str=“Tsinghua”;1.變量中存放的是地址2.指針變量不必加staticchar*a=“Tsinghua”;3.指針變量可用:char*a;a=“tsinghua”;4.對數(shù)組定義,編譯時已分配內(nèi)存單元,有確切地址5.

char*format[]=“a=%d,b=%f\n”;pr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論