程序設(shè)計(jì)基礎(chǔ)章 指針_第1頁
程序設(shè)計(jì)基礎(chǔ)章 指針_第2頁
程序設(shè)計(jì)基礎(chǔ)章 指針_第3頁
程序設(shè)計(jì)基礎(chǔ)章 指針_第4頁
程序設(shè)計(jì)基礎(chǔ)章 指針_第5頁
已閱讀5頁,還剩86頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

會(huì)計(jì)學(xué)1程序設(shè)計(jì)基礎(chǔ)章指針5.1.1指針的概念

按變量名訪問存取變量的方式稱為“直接訪問”方式intv=2,k;k=v*v;printf(“%d\t”,k);第1頁/共91頁通過另一個(gè)變量p訪問變量v的方式;稱為“間接訪問”的方式。須將變量v的地址存放在指針變量中指針變量第2頁/共91頁指針變量指針變量是一種特殊的變量;指針變量的值是另一個(gè)變量的地址;

通過指針變量的值(地址)可以訪問到該地址對(duì)應(yīng)的變量(目標(biāo)變量);通常稱指針變量指向目標(biāo)變量;

第3頁/共91頁5.1.2

指針變量的定義類型說明符*指針變量名;如int*pint;pint是指向整型變量的指針變量

char*pchar;pchar是指向字符型變量的指針變量目標(biāo)變量的類型指針類型說明符第4頁/共91頁思考pint和pchar占用內(nèi)存單元的字節(jié)數(shù)是否相同?

相同的在32位微機(jī)系統(tǒng)中,所有的指針變量在內(nèi)存中占4個(gè)字節(jié),而無論該指針變量指向什么類型的變量第5頁/共91頁注意區(qū)別

inta,bb,*c;char*p,*q,ch;float*pf1,num1,*pf2;第6頁/共91頁注意在使用指針前,必須給(已定義過的)指針賦于目標(biāo)變量的地址值。第7頁/共91頁5.1.3指針的賦值

C語言提供一元運(yùn)算符&可以獲取變量的地址intanint;int*pint;

pint=&anint;或初始化方式intanint;int*pint=&anint;取地址運(yùn)算符第8頁/共91頁

pint指向anintpintanint&anint&pint&anint………////////第9頁/共91頁可以將指針初始化為空指針。

int*pint=0;或

int*pint=NULL;空指針代表該指針沒有指向任何變量if(pint!=NULL){

…}#defineNULL0第10頁/共91頁注意1int*

組成一個(gè)整體,代表指向整形變量的指針類型

float*pf;某種類型的指針變量只能指向該類型的變量

floatradius;int*pint;pint=&radius;目標(biāo)變量類型指針變量名錯(cuò)誤第11頁/共91頁注意2指針變量只能存放已定義變量的地址不能為指針變量賦予任意的一個(gè)地址

不能將一個(gè)整數(shù)(無論什么進(jìn)制)直接賦給一個(gè)指針變量(除0外)。

如pchar=0x100;pchar=num;

錯(cuò)誤第12頁/共91頁思考如何間接訪問指針?biāo)赶虻哪繕?biāo)變量?第13頁/共91頁*運(yùn)算符稱為指針運(yùn)算符或間接訪問運(yùn)算符或取內(nèi)容運(yùn)算符若p是指針變量,則*p代表p所指向的目標(biāo)變量間接訪問

第14頁/共91頁例如intvalue;charch;int*pv=&value;char*pc=&ch;

pv的目標(biāo)變量value可表示為*pv,pc的目標(biāo)變量ch可表示為*pc,即*pv和value等效,*pc和ch等效

注意:通過指針訪問和變量名訪問目標(biāo)變量結(jié)果一樣,但內(nèi)部過程不一樣&pv和&pc表示指針針變量本身地址直接訪問間接訪問第15頁/共91頁注意區(qū)別*(語用規(guī)則)

i*jint*pi;

*pi=200;乘法運(yùn)算符指針說明符指針運(yùn)算符第16頁/共91頁指針變量不能與普通變量相互賦值

int*pn,num;char*pc,ch;

pn=num;或

num=pn;

pc=ch;或ch=pc;錯(cuò)誤第17頁/共91頁相同數(shù)據(jù)類型的指針變量之間可以相互賦值。如:inta,*pa,*pb;pa=&a;//pa指向a

pb=pa; //pb指向a第18頁/共91頁分析

int*ptr,x,y; ptr=&x;x=1; y=*ptr;*ptr=2;x,y的值是?第19頁/共91頁注意:指針變量的地址

指針也是變量,指針變量的地址是指它本身的內(nèi)存地址注意區(qū)分:指針變量的地址VS目標(biāo)變量的地址第20頁/共91頁例:直接訪問間接訪問

inta,b;

int*p1,*p2;

a=100;b=10;

p1=&a;p2=&b;printf(″%d,%d\n″,a,b);printf(″%d,%d\n″,*p1,*p2);第21頁/共91頁變量、變量地址、指針與指針地址

intu=5,v,*pu,*pv;pu=&u;v=*pu;pv=&v;printf("u=%d&u=%xpu=%x*pu=%d&pu=%x",u,&u,pu,*pu,&pu);printf("\nv=%d&v=%xpv=%x*pv=%d&pv=%x",v,&v,pv,*pv,&pv);u=5&u=ffccpu=ffcc*pu=5&pu=ffd0v=5&v=ffcepv=ffce*pv=5&pv=ffd2第22頁/共91頁例

int*p1,*p2,*p,a,b;

scanf(“%d,%d”,&a,&b);

p1=&a;p2=&b;

if(a<b)

{p=p1;p1=p2;p2=p;}

printf(″a=%d,b=%d\n″,a,b);

printf(″max=%d,min=%d\n″,*p1,*p2);第23頁/共91頁運(yùn)行情況如下:5,9↙a=5,b=9max=9,min=5第24頁/共91頁圖示第25頁/共91頁與上例比較

int*p1,*p2,t,a,b;

scanf(”%d,%d”,&a,&a);

p1=&a;p2=&b;printf(″a=%d,b=%d\n\n″,a,b)

if(a<b)

{t=*p1;*p1=*p2;*p2=t;}

printf(”a=%d,b=%d\n\”,a,b);第26頁/共91頁5.2指針運(yùn)算指針是一種值為地址值的特殊變量相關(guān)的運(yùn)算有四類:對(duì)指針賦值;取地址運(yùn)算“&”和取內(nèi)容運(yùn)算“*”;加、減;比較;第27頁/共91頁“&”和“*”互為逆運(yùn)算如:

intx,*ptr=&x;

則&(*ptr)表示指針ptr的值*(&x)表示變量x第28頁/共91頁例指針運(yùn)算符“&”和“*”

intu1,u2,v=3;int*pv; u1=2*(v+5); pv=&v; u2=2*(*pv+5); printf("u1=%du2=%d",u1,u2);程序運(yùn)行結(jié)果:

u1=16u2=16第29頁/共91頁指針與整數(shù)的加減運(yùn)算指針變量p已指向(數(shù)組中的)一個(gè)元素

p+1指向(同一數(shù)組中的)下一個(gè)元素

p-1指向(同一數(shù)組中的)上一個(gè)元素。第30頁/共91頁指針與整數(shù)的加減運(yùn)算指針變量p加上或減去一個(gè)整數(shù)n后結(jié)果仍然是一個(gè)相同類型的指針,表示:由指針當(dāng)前所指向的位置向前或向后移動(dòng)n個(gè)數(shù)據(jù)元素后的位置(注意:不是移動(dòng)n個(gè)字節(jié))。程序中“p+n”或“p-n”代表的實(shí)際地址(以字節(jié)編址):

p中地址值±n*sizeof(數(shù)據(jù)類型)

第31頁/共91頁指針自增、自減單目運(yùn)算也分前置和后置運(yùn)算,也都是以指針?biāo)赶虻臄?shù)據(jù)元素為移動(dòng)單位當(dāng)它們與其他運(yùn)算符組成一個(gè)表達(dá)式時(shí),應(yīng)注意其優(yōu)先順序和結(jié)合性。第32頁/共91頁如,p為指針變量:

v=*p++;“*”與“++”的優(yōu)先級(jí)高于“=”,而“*”與“++”兩個(gè)單目運(yùn)算符的優(yōu)先級(jí)相同,其結(jié)合性為從右到左。相當(dāng)于

v=*(p++);辨識(shí):v=(*p)++;v=*++p;v=(*p)++;第33頁/共91頁在一定條件下,兩個(gè)指向同種數(shù)據(jù)類型的指針可以相減。如,指向同一數(shù)組的兩個(gè)指針相減,其差表示這兩個(gè)指針?biāo)赶虻臄?shù)組元素之間所相差的元素個(gè)數(shù)。指針相減的運(yùn)算并不是兩個(gè)指針中的值(地址)的單純相減第34頁/共91頁指針相減的運(yùn)算

int*px,*py; staticinta[6]={10,20,30,40,50,60}; px=&a[0]; py=&a[5]; printf("px=%xpy=%x\n",px,py); printf("pypx=%x",pypx);程序運(yùn)行結(jié)果:

px=194py=19e pypx=5實(shí)際地址相差10個(gè)字節(jié)間隔5個(gè)元素第35頁/共91頁4、指針的關(guān)系運(yùn)算同種數(shù)據(jù)類型的指針進(jìn)行關(guān)系運(yùn)算表示它們所存放的地址之間的關(guān)系

<,>,==,!=第36頁/共91頁指針間允許4種關(guān)系運(yùn)算

<

>兩指針?biāo)淼牡刂返拇?、小關(guān)系

==!=判斷兩指針是否代表同一地址,即是否指向同一數(shù)據(jù)。第37頁/共91頁

指針不能與一般數(shù)值進(jìn)行關(guān)系運(yùn)算,但指針可以和零(NULL)之間進(jìn)行等于或不等于的關(guān)系運(yùn)算,如:

p==0;p!=0; 或p==NULL;p!=NULL;用于判斷指針p是否為空指針。第38頁/共91頁假設(shè)pa和pb為兩個(gè)有效且為指向基本類型的指針變量,pa!=NULL,pb!=NULL,下列命題:若pa==pb,則*pa==*pb;若*pa==*pb,則pa==pb;正確錯(cuò)誤第39頁/共91頁綜上所述,由于指針的運(yùn)算實(shí)質(zhì)上是地址運(yùn)算,因此,指針運(yùn)算是有限的,除了四類運(yùn)算外,其他運(yùn)算都是非法的。賦值*&加、減關(guān)系第40頁/共91頁5.3指針與數(shù)組對(duì)數(shù)組元素的訪問是采用的下標(biāo)法在C語言中,指針和數(shù)組之間存在密切的聯(lián)系。在引入指針變量后,可以利用一個(gè)指向數(shù)組的指針來完成對(duì)數(shù)組元素的訪問,這種方法稱為指針法。第41頁/共91頁5.3.1指針與一維數(shù)組一個(gè)數(shù)組名實(shí)際上是一個(gè)指針常量(數(shù)組首地址的符號(hào)地址)數(shù)組名代表數(shù)組的第一個(gè)元素的地址。

inta[100];則a代表&a[0]當(dāng)指針變量指向一維數(shù)組的第1個(gè)元素,指針變量名就可以當(dāng)成一維數(shù)組名使用;也可以通過指針移動(dòng)方式訪問數(shù)組元素。int*p=a;或int*p=&a[0];第42頁/共91頁通過數(shù)組首地址訪問數(shù)組元素的方式數(shù)組元素的下標(biāo)變量訪問:a[i]指針加偏移量類型的間接地址訪問:*(p+i)數(shù)組名作地址值的直接地址訪問:

*(a+i)指針作為數(shù)組名的下標(biāo)變量方式:p[i]

第43頁/共91頁即訪問一個(gè)數(shù)組元素,可以用:下標(biāo)法:a[i]

指針法:*(p+i)地址法:*(a+i)

指針下標(biāo)法:p[i]

第44頁/共91頁第45頁/共91頁下標(biāo)法和指針法的關(guān)系a為數(shù)組名:a[i]等價(jià)于*(a+i)p為指向數(shù)組元素的指針:p[i]等價(jià)于*(p+i)

第46頁/共91頁例如inta[20],*p;

p=a;

或p=&a[0];則下標(biāo)為i的元素可表示為:

a[i],*(a+i),p[i],*(p+i),下標(biāo)為i的元素的地址可表示為:

&a[i],a+i,&p[i],p+i第47頁/共91頁思考inta[20],*p;p=&a[2];

則p[i]代表?第48頁/共91頁注意數(shù)組名是指針常量,不是指針變量,不能給數(shù)組名賦值。intdata[10],*p;

數(shù)組名data和指針p均與地址相關(guān),但:data是一個(gè)指針常量,其值是由編譯程序給定的數(shù)組起始地址,是不能改變的指針p是一個(gè)指針變量,在程序運(yùn)行中可以改變,它可以指向任一個(gè)數(shù)組元素,也可以指向其它任意整型變量。第49頁/共91頁以下語句是合法的:

p=data; p++;p=p+3;以下語句是非法的:

data=p;data++; data=data+3;第50頁/共91頁例

指針與數(shù)組的關(guān)系

intdata[10],i,*p; for(i=0;i<10;i++) data[i]=i+1; p=data; for(i=0;i<10;i++){ printf("*(p+%d)=%d\t",i,*(p+i));

printf("data(%d)=%d\n",i,data[i]);}第51頁/共91頁程序運(yùn)行結(jié)果

*(p+0)=1data(0)=1*(p+1)=2data(1)=2*(p+2)=3data(2)=3*(p+3)=4data(3)=4*(p+4)=5data(4)=5*(p+5)=6data(5)=6*(p+6)=7data(6)=7*(p+7)=8data(7)=8*(p+8)=9data(8)=9*(p+9)=10data(9)=10第52頁/共91頁表達(dá)式*(p+i)和data[i]是等價(jià)的是用指針法和下標(biāo)法來表示訪問數(shù)組元素的兩種不同形式。第53頁/共91頁指針方式訪問數(shù)組元素,計(jì)算和

intiarray[10]={0,2,4,6,8,10,12,14,16,18};intsum=0,i;int*iptr=iarray;/*指針指向數(shù)組*/for(i=0;i<10;i++){sum+=*iptr;

iptr++;}printf(”sumis%d\n”,sum);

運(yùn)行結(jié)果為:sumis90第54頁/共91頁數(shù)組的求和元素運(yùn)算,有五種方法

intsum1,sum2,sum3,sum4,sum5;intiarray[]={1,4,2,7,13,32,21,48,16,30};int*iptr;intsize,n;

size=sizeof(iarray)/sizeof(*iarray);for(n=0;n<size;n++)/*方法1*/sum1+=iarray[n];下標(biāo)變量法第55頁/共91頁

iptr=iarray;/*方法2*/for(n=0;n<size;n++)sum2+=*iptr++;

iptr=iarray;/*方法3*/for(n=0;n<size;n++)sum3+=*(iptr+n);指針法指針法第56頁/共91頁

iptr=iarray;/*方法4*/for(n=0;n<size;n++)sum4+=iptr[n];for(n=0;n<size;n++)/*方法5*/sum5+=*(iarray+n);地址引用法指針下標(biāo)法第57頁/共91頁獲取數(shù)組起始地址的兩種方法數(shù)組名

p=arr;數(shù)組的首元素地址。

p=&arr[0];第58頁/共91頁指針訪問二維數(shù)組指針可訪問一維數(shù)組,也可訪問多維數(shù)組inta[5][4],*pa;pa=a[0]等效pa=a或 pa=&a[0][0];pa=a[4]等效pa=&a[4][0];第59頁/共91頁5.3.2指針與結(jié)構(gòu)數(shù)組structinfo{shortnum;charname[5];}; structinfomyinfo,*p_info;若p_info=&myinfo;則可以用指針訪問結(jié)構(gòu)成員第60頁/共91頁第61頁/共91頁三種存取結(jié)構(gòu)成員的方式通過結(jié)構(gòu)變量名和成員運(yùn)算符(.)

myinfo.num通過指向結(jié)構(gòu)的指針、指針運(yùn)算符(*)和成員運(yùn)算符(.)(*p_info).num通過指向結(jié)構(gòu)的指針和成員運(yùn)算符()

p_infonum第62頁/共91頁結(jié)構(gòu)數(shù)組和指向結(jié)構(gòu)的指針把結(jié)構(gòu)數(shù)組和指向結(jié)構(gòu)的指針結(jié)合起來使用通過指針來存取結(jié)構(gòu)數(shù)組中元素及各元素的成員。第63頁/共91頁例:輸入同學(xué)的信息并按身高排序

p_stu=stu+1;

//p_stu指向stu[1]

for(i=1;p_stu<=stu+n;p_stu++,i++){…p_stu>height

…}

第64頁/共91頁5.4字符串指針可以利用字符數(shù)組或字符指針代表一個(gè)字符串字符數(shù)組

charstr[]=“hello”;字符串常量

“chengdu”第65頁/共91頁字符指針字符串常量和字符數(shù)組名都具有地址特性,因而可以把它們賦給一個(gè)字符指針這時(shí),輸出字符指針就是輸出指針指向的字符串,如:printf(“%s”,pstr);而,輸出字符指針指向的目標(biāo)對(duì)象,就是輸出指針指向的單個(gè)字符。如printf(“%c”,*pstr);

printf(“%c”,*(pstr+1));第66頁/共91頁字符指針變量和字符數(shù)組對(duì)字符數(shù)組只能對(duì)各個(gè)元素賦值

charstr[]=“hello”;//okscanf(“%s”,str);//ok注意范圍

str=“l(fā)ove”;//error對(duì)字符指針變量,可以用字符串直接賦值:

char*p=“hello”;//ok

p=“IloveChina!”;//ok第67頁/共91頁字符指針變量和字符數(shù)組指針變量的值是可以改變的若字符指針變量p指向字符串,就可以用指針變量帶下標(biāo)或偏移的形式訪問字符串中的字符,如p[i]、*(p+i)第68頁/共91頁字符數(shù)組中各元素的值是可以改變的(可以對(duì)它們?cè)儋x值和修改)若字符指針變量指向字符串常量,盡管可以對(duì)指針變量本身進(jìn)行改變,但不能賦值和修改字符指針指向的字符串常量中的內(nèi)容。

第69頁/共91頁chara[]=“House”;char*b=“House”;a[2]=’r’;//合法

b[2]=’r’;//非法,字符串常量不能改變

b=a;

b[2]=’r’;?第70頁/共91頁例用字符指針輸出字符串

charstr[]="turboc"; char*ps=str; while(*ps){

putchar(*ps); ps++;

}

程序運(yùn)行結(jié)果:

turbocputchar(*ps++);第71頁/共91頁例:

charbuffer[10]=“ABC”;char*pc;pc=“hello”;/*指針指向字符串常量*/printf(”%s\n”,pc);/*輸出指針指向字符串hello*/

pc++;printf(”%s\n”,pc);/*輸出指針指向字符串ello*/printf(”%c\n”,*pc);/*輸出指針指向字符e*/

pc=buffer;printf(”%s\n”,pc);/*輸出指針指向字符串ABC*/第72頁/共91頁字符串(常量)的輸出char*point;point=“Thisisastring.”;printf(”%s”,point);輸出:Thisisastring.第73頁/共91頁字符串復(fù)制—字符數(shù)組方式chara[]=“Iamaboy.”,b[20];

inti;

for(i=0;*(a+i)!=‘\0’;i++)*(b+i)=*(a+i);//等價(jià)于b[i]=a[i];

*(b+i)=‘\0’;//等價(jià)于b[i]=‘\0’;

printf(“stringais:%s\n”,a);

printf(“stringbis:%s\n”,b);第74頁/共91頁字符串復(fù)制—字符指針方式

chara[]=“Iamaboy.”,b[20],*p1,*p2;

inti;

p1=a;p2=b;

for(;*p1!=‘\0’;p1++,p2++)*p2=*p1;

*p2=‘\0’;//Why?printf(“%s”,b);p1和p2同步移動(dòng)第75頁/共91頁使用指針,合并字符串s1和s2chars1[50],s2[20];char*p=s1,*q=s2;scanf(”s1=%s\ns2=%s”,s1,s2);while(*p!=‘\0’)/*找到s1中字符串的結(jié)尾*/p++;while(*q!=‘\0’)/*將s2合并到s1的后面*/*p++=*q++;

*p=‘\0’;printf(“%s\n”,s1);第76頁/共91頁

*p++=*q++;等價(jià)于*p=*q;q++;p++;第77頁/共91頁5.5指針數(shù)組一個(gè)數(shù)組中若每個(gè)元素都是一個(gè)指針,則稱為指針數(shù)組。

char*proname[]={“FORTRAN”,“C”,“C++”};該數(shù)組的每個(gè)元素是指向字符串的字符指針第78頁/共91頁該字符數(shù)組的內(nèi)存表示如下:22512259225B4400440244042251‘F’‘O’‘R’‘T’‘R’‘A’‘N’‘\0’‘C’‘\0’‘C’‘+’‘+’‘\0’……22522253225422552256225722582259225A225B225C225D225Echar*proname[]第79頁/共91頁指針數(shù)組與二維數(shù)組字符指針數(shù)組與二維字符數(shù)組的不同之處字符指針數(shù)組元素指向的字符串可以是不同的長(zhǎng)度(節(jié)約空間)。

charname[3][8]={“FORTRAN”,“C”,“C++”};第80頁/共91頁按字典順序?qū)Χ鄠€(gè)字符串排序

char*str[]={"turboc","turbopascal","basic","dbase","li

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論