




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C程序設(shè)計(jì)----組織數(shù)據(jù)ProgrammingInCC程序設(shè)計(jì)課程組織C語(yǔ)言入門(mén)數(shù)據(jù)操作過(guò)程組織基本算法判斷與選擇-------分支迭代與遞推-------循環(huán)窮舉-------流程轉(zhuǎn)向控制遞歸--------變量的存儲(chǔ)類型組織數(shù)據(jù)數(shù)組結(jié)構(gòu)指針文件ProgrammingInC課程組織C語(yǔ)言入門(mén)ProgrammingInC組織數(shù)據(jù)-----1.數(shù)組(處理批量數(shù)據(jù))數(shù)組類型;常用算法:排序、查找、求最大最小值等;用字符數(shù)組存取字符串;使用字符串處理函數(shù)處理字符串向函數(shù)傳遞一維數(shù)組和二維數(shù)組;(指針)ProgrammingInC組織數(shù)據(jù)-----1.數(shù)組(處理批量數(shù)據(jù))Programmi組織數(shù)據(jù)-----2.指針(地址)指針的概念;難點(diǎn):對(duì)指針數(shù)據(jù)類型的理解數(shù)組的下標(biāo)法引用和指針?lè)ㄒ?;難點(diǎn):二維數(shù)組的地址和指針概念利用字符指針存取字符串;難點(diǎn):字符數(shù)組和字符指針的區(qū)別與聯(lián)系指針數(shù)組應(yīng)用;難點(diǎn):指向數(shù)組的指針與指針數(shù)組的區(qū)別帶參數(shù)的main函數(shù);。。。。。ProgrammingInC組織數(shù)據(jù)-----2.指針(地址)指針的概念;Program一、指針的概念變量與地址程序中:inti;
floatk;
內(nèi)存中每個(gè)字節(jié)有一個(gè)編號(hào)-----地址…...…...2000200120022005內(nèi)存02003ik
編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元變量是對(duì)程序中數(shù)據(jù)存儲(chǔ)空間的抽象ProgrammingInC一、指針的概念程序中:inti;內(nèi)存中內(nèi)存單元與地址main(){chara;intb;floatc;intd[3];intmax();
……}地址ProgrammingInC內(nèi)存單元與地址main()地址ProgrammingIn…...…...2000200420062005整型變量i10變量i_pointer200120022003指針與指針變量指針:一個(gè)變量的地址指針變量:專門(mén)存放變量地址的變量2000指針指針變量變量的內(nèi)容
變量的地址指針變量變量變量地址(指針)變量值指向地址存入指針變量ProgrammingInC…...…...2000200420062005整型變量i1&與*運(yùn)算符含義含義:取變量的地址單目運(yùn)算符優(yōu)先級(jí):2結(jié)合性:自右向左含義:取指針?biāo)赶蜃兞康膬?nèi)容單目運(yùn)算符優(yōu)先級(jí):2結(jié)合性:自右向左兩者關(guān)系:互為逆運(yùn)算理解…...…...2000200420062005整型變量i10變量i_pointer2001200220032000指針變量i_pointer-----指針變量,它的內(nèi)容是地址量*i_pointer----指針的目標(biāo)變量,它的內(nèi)容是數(shù)據(jù)&i_pointer---指針變量占用內(nèi)存的地址200010i_pointer*i_pointer&i_pointeriProgrammingInC&與*運(yùn)算符含義:取變量的地址含義:取指針?biāo)赶蜃兞康膬?nèi)直接訪問(wèn)與間接訪問(wèn)直接訪問(wèn):按變量地址存取變量值間接訪問(wèn):通過(guò)存放變量地址的變量去訪問(wèn)變量例i=3;-----直接訪問(wèn)指針變量…...…...2000200420062005整型變量i10變量i_pointer20012002200320003例*i_pointer=20;-----間接訪問(wèn)20ProgrammingInC直接訪問(wèn)與間接訪問(wèn)例i=3;---指針變量…...…...2000200420062005整型變量i10變量i_pointer2001200220032000整型變量k例k=i;--直接訪問(wèn)k=*i_pointer;--間接訪問(wèn)10例k=i;k=*i_pointer;ProgrammingInC指針變量…...…...2000200420062005整型指針變量指針變量與其所指向的變量之間的關(guān)系指針變量的定義一般形式:數(shù)據(jù)類型*指針名;3變量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=33變量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=3合法標(biāo)識(shí)符指針的目標(biāo)變量的數(shù)據(jù)類型表示定義指針變量不是‘*’運(yùn)算符例
int
*p1,*p2;float*q;注意:1、int*p1,*p2;
與int*p1,p2;2、指針變量名是p1,p2,不是*p1,*p23、指針變量只能指向定義時(shí)所規(guī)定類型的變量4、指針變量定義后,變量值不確定,應(yīng)用前必須先賦值ProgrammingInC指針變量指針變量的定義3變量i2000i_pointer*i指針變量的初始化一般形式:數(shù)據(jù)類型*指針名=初始地址值;賦給指針變量,不是賦給目標(biāo)變量例
inti;int*p=&i;變量必須已說(shuō)明過(guò)類型應(yīng)一致例int*p=&i;
inti;例
inti;int*p=&i;int*q=p;用已初始化指針變量作初值ProgrammingInC指針變量的初始化賦給指針變量,例inti;變量必須已例
main(){inti=10;int*p;
*p=i;printf(“%d”,*p);}危險(xiǎn)!例main(){inti=10,k;int*p;
p=&k;*p=i;printf(“%d”,*p);}指針變量必須先賦值,再使用…...…...2000200420062005整型變量i10指針變量p200120022003隨機(jī)ProgrammingInC例main()危險(xiǎn)!例main()指針變零指針與空類型指針零指針:(空指針)定義:指針變量值為零表示:
int*p=0;
p指向地址為0的單元,系統(tǒng)保證該單元不作它用表示指針變量值沒(méi)有意義#defineNULL0int*p=NULL:p=NULL與未對(duì)p賦值不同用途:避免指針變量的非法引用在程序中常作為狀態(tài)比較例int*p;......while(p!=NULL){...…}void*類型指針表示:void*p;使用時(shí)要進(jìn)行強(qiáng)制類型轉(zhuǎn)換例char*p1;void*p2;p1=(char*)p2;p2=(void*)p1;表示不指定p是指向哪一種類型數(shù)據(jù)的指針變量ProgrammingInC零指針與空類型指針p指向地址為0的單元,#define例指針的概念main(){inta;
int*pa=&a;a=10;printf("a:%d\n",a);printf("*pa:%d\n",*pa);printf("&a:%x(hex)\n",&a);printf("pa:%x(hex)\n",pa);printf("&pa:%x(hex)\n",&pa);}運(yùn)行結(jié)果:a:10*pa:10&a:f86(hex)pa:f86(hex)&pa:f88(hex)…...…...f86f8af8cf8b整型變量a10指針變量paf87f88f89f86ProgrammingInC例指針的概念main()運(yùn)行結(jié)果:…...…...f86例輸入兩個(gè)數(shù),并使其從大到小輸出/*1-0*/main(){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);}運(yùn)行結(jié)果:a=5,b=9max=9,min=5…...…...指針變量p1指針變量p20002008200220042006
指針變量p2
整型變量b
整型變量a5200692008200620082006ProgrammingInC例輸入兩個(gè)數(shù),并使其從大到小輸出/*1-0*/main(二、指針與數(shù)組指向數(shù)組元素的指針變量例intarray[10];int*p;
p=&array[0];//p=array;或int*p=&array[0];或int*p=array;array[0]array[1]array[2]array[3]array[9]...整型指針p&array[0]p數(shù)組名是表示數(shù)組首地址的地址常量ProgrammingInC二、指針與數(shù)組指針的運(yùn)算指針變量的賦值運(yùn)算p=&a;(將變量a地址p)p=array;(將數(shù)組array首地址p)p=&array[i];(將數(shù)組元素地址p)p1=p2;(指針變量p2值p1)不能把一個(gè)整數(shù)p,也不能把p的值整型變量如inti,*p;p=1000;()i=p;()指針變量與其指向的變量具有相同數(shù)據(jù)類型ProgrammingInC指針的運(yùn)算如inti,*p;指針變量與其指針的算術(shù)運(yùn)算:pipid(i為整型數(shù),d為p指向的變量所占字節(jié)數(shù))p++,p--,p+i,p-i,p+=i,p-=i等若p1與p2指向同一數(shù)組,p1-p2=兩指針間元素個(gè)數(shù)(p1-p2)/dp1+p2無(wú)意義例p指向float數(shù),則p+1p+14例p指向int型數(shù)組,且p=&a[0];則p+1指向a[1]例inta[10];int*p=&a[2];p++;*p=1;例inta[10];int*p1=&a[2];int*p2=&a[5];
則:p2-p1=3;a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a數(shù)組pp+1,a+1p+i,a+ip+9,a+91ProgrammingInC指針的算術(shù)運(yùn)算:例p指向float數(shù),則p+1p指針變量的關(guān)系運(yùn)算若p1和p2指向同一數(shù)組,則p1<p2表示p1指的元素在前p1>p2表示p1指的元素在后p1==p2表示p1與p2指向同一元素若p1與p2不指向同一數(shù)組,比較無(wú)意義p==NULL或p!=NULLProgrammingInC指針變量的關(guān)系運(yùn)算ProgrammingInC數(shù)組元素表示方法inta[10],*p=a;a[0]a[1]a[2]a[3]a[9]...aa+9a+1a+2地址元素下標(biāo)法a[0]a[1]a[2]a[9]a[0]a[1]a[2]a[3]a[9]...pp+9p+1p+2地址元素指針?lè)?p*(p+1)*(p+2)*(p+9)[]變址運(yùn)算符a[i]
*(a+i)a[i]p[i]*(p+i)*(a+i)*a*(a+1)*(a+2)*(a+9)p[0]p[1]p[2]p[9]ProgrammingInC數(shù)組元素表示方法inta[10],*p=a;a[0a[0]a[1]a[2]a[3]a[4]例數(shù)組元素的引用方法main(){inta[5],*pa,i;for(i=0;i<5;i++) a[i]=i+1;pa=a;for(i=0;i<5;i++) printf("*(pa+%d):%d\n",i,*(pa+i));for(i=0;i<5;i++) printf("*(a+%d):%d\n",i,*(a+i));for(i=0;i<5;i++) printf("pa[%d]:%d\n",i,pa[i]);for(i=0;i<5;i++) printf("a[%d]:%d\n",i,a[i]);}12345paProgrammingInCa[0]a[1]a[2]a[3]a[4]例數(shù)組元素的引main(){inti,*p,a[7];p=a;for(i=0;i<7;i++)scanf("%d",p++);printf("\n");for(i=0;i<7;i++,p++)printf("%d",*p);}例注意指針的當(dāng)前值p=a;pp58762730123456apppppp指針變量可以指到數(shù)組后的內(nèi)存單元ProgrammingInCmain()例注意指針的當(dāng)前值p=a;pp5876273一級(jí)指針變量與一維數(shù)組的關(guān)系int*p與intq[10]數(shù)組名是指針(地址)常量p=q;p+i是q[i]的地址數(shù)組元素的表示方法:下標(biāo)法和指針?lè)?,即若p=q,則
p[i]q[i]*(p+i)*(q+i)
形參數(shù)組實(shí)質(zhì)上是指針變量,即intq[]int*q在定義指針變量(不是形參)時(shí),不能把int*p寫(xiě)成intp[];系統(tǒng)只給p分配能保存一個(gè)指針值的內(nèi)存區(qū)(一般2字節(jié));而給q分配2*10字節(jié)的內(nèi)存區(qū)ProgrammingInC一級(jí)指針變量與一維數(shù)組的關(guān)系ProgrammingIn三、指針與二維數(shù)組二維數(shù)組的地址對(duì)于一維數(shù)組:(1)數(shù)組名array表示數(shù)組的首地址,即array[0]的地址;(2)數(shù)組名array是地址常量(3)array+i是元素array[i]的地址(4)array[i]*(array+i)arrayintarray[10];ProgrammingInC三、指針與二維數(shù)組對(duì)于一維數(shù)組:arrayint對(duì)于二維數(shù)組:(1)a是數(shù)組名,
包含三個(gè)元素a[0],a[1],a[2](2)每個(gè)元素a[i]
又是一個(gè)一維
數(shù)組,包含4個(gè)
元素aa+1a+2*(*(a+0)+1)*(a[0]+1)inta[3][4];a[0]a[1]a[2]200020082016200020022008201020162018a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]基類型行指針與列指針a[0]+1a[1]+1a[2]+1*(a+0)+1*(a+1)+1*(a+2)+1ProgrammingInC對(duì)于二維數(shù)組:aa+1a+2*(*(a+0)+1)*(a[0對(duì)二維數(shù)組inta[3][4],有a-----二維數(shù)組的首地址,即第0行的首地址a+i-----第i行的首地址a[i]*(a+i)------第i行第0列的元素地址a[i]+j*(a+i)+j-----第i行第j列的元素地址*(a[i]+j)*(*(a+i)+j)a[i][j]a+i=&a[i]=a[i]=*(a+i)=&a[i][0],值相等,含義不同a+i&a[i],表示第i行首地址,指向行a[i]*(a+i)&a[i][0],表示第i行第0列元素地址,指向列inta[3][4];a[0]a[1]a[2]200020082016200020022008201020162018a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]aa+1a+2ProgrammingInC對(duì)二維數(shù)組inta[3][4],有a+i=&a[i]inta[3][4];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]二維數(shù)組元素表示形式:(1)a[1][2](2)*(a[1]+2)(3)*(*(a+1)+2)(4)*(&a[0][0]+1*4+2)地址表示:(1)a+1
(2)&a[1][0](3)a[1](4)*(a+1)(5)(int*)(a+1)行指針列指針地址表示:(1)&a[1][2](2)a[1]+2(3)*(a+1)+2(4)&a[0][0]+1*4+2ProgrammingInCinta[3][4];a[0][0]a[0][1]a[1表示形式含義地址a二維數(shù)組名,數(shù)組首地址a[0],*(a+0),*a第0行第0列元素地址a+1第1行首地址a[1],*(a+1)第1行第0列元素地址a[1]+2,*(a+1)+2,&a[1][2]第1行第2列元素地址*(a[1]+2),*(*(a+1)+2),a[1][2]第1行第2列元素值2000200020082008201213ProgrammingInC表示形式含義地址a二維數(shù)組名,數(shù)組首地址a[0],*(a+0四、
指針與字符串字符串表示形式用字符數(shù)組實(shí)現(xiàn)例main(){charstring[]=“IloveChina!”;printf(“%s\n”,string);printf(“%s\n”,string+7);}IloveChistring[0]string[1]string[2]string[3]string[4]string[5]string[6]string[7]string[8]string[9]stringstring[10]string[11]string[12]string[13]n!a\0ProgrammingInC四、指針與字符串例mai用字符指針實(shí)現(xiàn)例#include<stdio.h>main(){ char*string="IloveChina!"; printf("%s\n",string); string+=7; while(*string) { putchar(string[0]); string++; }}IloveChistringn!a\0字符指針初始化:把字符串首地址賦給stringchar*string;string="IloveChina!";string*string!='\0'ProgrammingInC用字符指針實(shí)現(xiàn)例#include<stdio.h>I字符指針變量與字符數(shù)組char*cp;與charstr[20];str由若干元素組成,每個(gè)元素放一個(gè)字符;而cp中存放字符串首地址charstr[20];str=“IloveChina!”;()char*cp;cp=“IloveChina!”;()str是地址常量;cp是地址變量cp接受鍵入字符串時(shí),必須先開(kāi)辟存儲(chǔ)空間例charstr[10];scanf(“%s”,str);()而char*cp;scanf(“%s”,cp);()改為:char*cp,str[10];cp=str;scanf(“%s”,cp);()ProgrammingInC字符指針變量與字符數(shù)組例charstr[10];改字符串與數(shù)組關(guān)系字符串用一維字符數(shù)組存放字符數(shù)組具有一維數(shù)組的所有特點(diǎn)數(shù)組名是指向數(shù)組首地址的地址常量數(shù)組元素的引用方法可用指針?lè)ê拖聵?biāo)法數(shù)組名作函數(shù)參數(shù)是地址傳遞等區(qū)別存儲(chǔ)格式:字符串結(jié)束標(biāo)志賦值方式與初始化輸入輸出方式:%s%ccharstr[]={“Hello!”};()charstr[]=“Hello!”;()charstr[]={‘H’,‘e’,‘l’,‘l’,‘o’,‘!’};()char*cp=“Hello”;()inta[]={1,2,3,4,5};()int*p={1,2,3,4,5};()charstr[10],*cp;inta[10],*p;str=“Hello”;()cp=“Hello!”;()a={1,2,3,4,5};()p={1,2,3,4,5};()scanf(“%s”,str);printf(“%s”,str);gets(str);puts(str);ProgrammingInC字符串與數(shù)組關(guān)系charstr[]={“Hello!”五、二維數(shù)組的指針變量指向二維數(shù)組元素的指針變量例指向二維數(shù)組元素的指針變量-列指針main(){staticinta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int*p;for(p=a[0];p<a[0]+12;p++){if((p-a[0])%4==0)printf("\n"); printf("%4d",*p);}}p=*a;p=&a[0][0];p=*(a+0);p=a;p=*a;p=&a[0][0];p=(int*)a;p=a;inta[3][4];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]pProgrammingInC五、二維數(shù)組的指針變量例指向二維數(shù)組元素的指針變量-列指指向一維數(shù)組的指針變量-行指針定義形式:數(shù)據(jù)類型(*指針名)[一維數(shù)組維數(shù)];例int(*p)[4];()不能少int(*p)[4]與int*p[4]不同p的值是一維數(shù)組的首地址,p是行指針可讓p指向二維數(shù)組某一行如inta[3][4],(*p)[4]=a;inta[3][4];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]aa+1a+2pp+1p+2p[0]+1或*p+1p[1]+2或*(p+1)+2*(*p+1)*(*(p+1)+2)一維數(shù)組指針變量維數(shù)和二維數(shù)組列數(shù)必須相同行指針形式:int(*p)[n];含義:p為指向含有n個(gè)元素的一維數(shù)組的指針變量賦值:行指針變量=2維數(shù)組名或行指針變量ProgrammingInC指向一維數(shù)組的指針變量-行指針()不能少p的值是一維數(shù)組的例一維數(shù)組指針變量舉例main(){staticinta[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
inti,j,(*p)[4];for(p=a,i=0;i<3;i++,p++)for(j=0;j<4;j++)printf("%d",*(*p+j));printf("\n");}p=a[0];p=*a;p=&a[0][0];p=&a[0];p=a[0];p=*a;p=&a[0][0];p=&a[0];inta[3][4];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]pppp[0][j]ProgrammingInC例一維數(shù)組指針變量舉例main()p=a[0];p=a六、指針數(shù)組和多級(jí)指針用于處理二維數(shù)組或多個(gè)字符串指針數(shù)組定義:數(shù)組中的元素為指針變量定義形式:數(shù)據(jù)類型*數(shù)組名[數(shù)組長(zhǎng)度說(shuō)明];例int*p[4];指針?biāo)赶蜃兞康臄?shù)據(jù)類型區(qū)分int*p[4]與int(*p)[4]指針數(shù)組賦值與初始化賦值:main(){intb[2][3],*pb[2];
pb[0]=b[0];pb[1]=b[1];……..}int*pb[2]pb[0]pb[1]intb[2][3]123246初始化:main(){intb[2][3],*pb[]={b[0],b[1]};……..}int*pb[2]pb[0]pb[1]intb[2][3]123246ProgrammingInC六、指針數(shù)組和多級(jí)指針指針?biāo)钢羔様?shù)組賦值與初始化Lisp\0Fortran\0Basic\0p[0]p[1]p[2]p[3]0賦值:main(){chara[]="Fortran";charb[]="Lisp";charc[]="Basic";
char*p[4];
p[0]=a;p[1]=b;p[2]=c;p[3]=NULL;……..}或:main(){char*p[4];p[0]="Fortran";p[1]="Lisp";p[2]="Basic";p[3]=NULL;……..}初始化:main(){char*p[]={"Fortran","Lisp","Basic",NULL};……..}Lisp\0Fortran\0Basic\0p[0]p[1]p[2]p[3]0ProgrammingInC指針數(shù)組賦值與初始化Lisp\0
charname[5][9]={“gain”,“much”,“stronger”,“point”,“bye”};
char*name[5]={“gain”,“much”,“stronger”,“point”,“bye”};gain\0stronger\0point\0much\0name[0]name[1]name[2]name[3]name[4]bye\0gain\0stronger\0point\0much\0bye\0二維數(shù)組與指針數(shù)組區(qū)別:二維數(shù)組存儲(chǔ)空間固定字符指針數(shù)組相當(dāng)于可變列長(zhǎng)的二維數(shù)組分配內(nèi)存單元=數(shù)組維數(shù)*2+各字符串長(zhǎng)度指針數(shù)組元素的作用相當(dāng)于二維數(shù)組的行名但指針數(shù)組中元素是指針變量二維數(shù)組的行名是地址常量ProgrammingInCcharname[5][9]={“gain”,“muc多級(jí)指針定義:指向指針的指針一級(jí)指針:指針變量中存放目標(biāo)變量的地址p1&p2&i3P2(指針變量)i(整型變量)例int**p1;
int*p2;inti=3;p2=&i;p1=&p2;**p1=5;二級(jí)指針:指針變量中存放一級(jí)指針變量的地址例int*p;
inti=3;p=&i;*p=5;&i3P(指針變量)i(整型變量)一級(jí)指針單級(jí)間接尋址二級(jí)指針一級(jí)指針目標(biāo)變量二級(jí)間接尋址ProgrammingInC多級(jí)指針p1&p2&i3P2(指針變量)i(整型變量)例定義形式:數(shù)據(jù)類型**指針名;如char**p;例inti,**p;p=&i;()//p是二級(jí)指針,不能用變量地址為其賦值最終目標(biāo)變量的數(shù)據(jù)類型*p是p間接指向?qū)ο蟮牡刂?*p是p間接指向?qū)ο蟮闹道齣nti=3;
int*p1;
int**p2;p1=&i;p2=&p1;**p=5;ip1p23&i&p1**p2,*p1*p2多級(jí)指針例三級(jí)指針int***p;
四級(jí)指針char****p;ProgrammingInC定義形式:數(shù)據(jù)類型**指針名;例inti定義含義inti;int*p;inta[n];int*p[n];int(*p)[n];intf();int*p();int(*p)();int**p;定義整型變量ip為指向整型數(shù)據(jù)的指針變量定義含n個(gè)元素的整型數(shù)組an個(gè)指向整型數(shù)據(jù)的指針變量組成的指針數(shù)組pp為指向含n個(gè)元素的一維整型數(shù)組的指針變量f為返回整型數(shù)的函數(shù)p為返回指針的函數(shù),該指針指向一個(gè)整型數(shù)據(jù)p為指向函數(shù)的指針變量,該函數(shù)返回整型數(shù)p為指針變量,它指向一個(gè)指向整型數(shù)據(jù)的指針變量指針的數(shù)據(jù)類型ProgrammingInC定義含義inti;int*p;inta[n];i例下列定義的含義(1)int*p[3];(2)int(*p)[3];(3)int*p(int);(4)int(*p)(int);指針數(shù)組指向一維數(shù)組的指針?lè)祷刂羔樀暮瘮?shù)指向函數(shù)的指針,函數(shù)返回int型變量ProgrammingInC例下列定義的含義指針數(shù)組指向一維數(shù)組的指針?lè)祷刂羔樀暮樞虿檎?。從?shù)組中查找指定的數(shù)據(jù),并輸出其序號(hào).#include<stdio.h>main(){inti,n,a[10]={4,6,2,9,7,3,0,5,1,8};printf("arrayare:");for(i=0;i<10;i++)printf("%3d",a[i]);printf("\nInputanumbertofind:");scanf("%d",&n);
for(i=0;i<10;i++)if(a[i]==n)break;
if(i<10)printf("pos=%d\n",i);elseprintf("pos=-1\n");}思考:統(tǒng)計(jì)數(shù)組中某個(gè)元素出現(xiàn)的個(gè)數(shù),應(yīng)如何設(shè)計(jì)?ProgrammingInC順序查找。從數(shù)組中查找指定的數(shù)據(jù),并輸出其序號(hào).Progralowhighmid例1234567891011513192137566475808892找211234567891011513192137566475808892lowhighmid1234567891011513192137566475808892lowhighmid折半查找。從有序數(shù)組中查找指定的數(shù)據(jù)算法描述:ProgrammingInClowhighmid例123例1234567891011513192137566475808892lowhighmid找701234567891011513192137566475808892lowhighmid1234567891011513192137566475808892lowhighmid1234567891011513192137566475808892lowhighmidProgrammingInC例1234折半查找。從有序數(shù)組中查找指定的數(shù)據(jù)算法實(shí)現(xiàn)設(shè)數(shù)組長(zhǎng)為n,low、high和mid分別指向待查元素所在區(qū)間的上界、下界和中點(diǎn),k為給定值初始時(shí),令low=0,high=n-1,mid=(low+high)/2讓k與mid指向的記錄比較若k==a[mid],查找成功若k<a[mid],則high=mid-1若k>a[mid],則low=mid+1重復(fù)上述操作,直至low>high時(shí),查找失敗ProgrammingInC折半查找。從有序數(shù)組中查找指定的數(shù)據(jù)Programming#include<stdio.h>main(){inti,n,s[10]={2,5,7,8,12,16,24,32,36,40};intlow,high,mid; printf("arrayare:");for(i=0;i<10;i++)printf("%3d",s[i]);printf("\nInputanumbertofind:");scanf("%d",&n);low=0;high=9;while(low<=high) {mid=(low+high)/2;if(s[mid]>n)high=mid-1;elseif(s[mid]<n)low=mid+1;elsebreak;}if(low>high)printf("pos=-1\n");elseprintf("pos=%d\n",mid);}ProgrammingInC#include<stdio.h>ProgrammingC程序設(shè)計(jì)----組織數(shù)據(jù)ProgrammingInCC程序設(shè)計(jì)課程組織C語(yǔ)言入門(mén)數(shù)據(jù)操作過(guò)程組織基本算法判斷與選擇-------分支迭代與遞推-------循環(huán)窮舉-------流程轉(zhuǎn)向控制遞歸--------變量的存儲(chǔ)類型組織數(shù)據(jù)數(shù)組結(jié)構(gòu)指針文件ProgrammingInC課程組織C語(yǔ)言入門(mén)ProgrammingInC組織數(shù)據(jù)-----1.數(shù)組(處理批量數(shù)據(jù))數(shù)組類型;常用算法:排序、查找、求最大最小值等;用字符數(shù)組存取字符串;使用字符串處理函數(shù)處理字符串向函數(shù)傳遞一維數(shù)組和二維數(shù)組;(指針)ProgrammingInC組織數(shù)據(jù)-----1.數(shù)組(處理批量數(shù)據(jù))Programmi組織數(shù)據(jù)-----2.指針(地址)指針的概念;難點(diǎn):對(duì)指針數(shù)據(jù)類型的理解數(shù)組的下標(biāo)法引用和指針?lè)ㄒ?;難點(diǎn):二維數(shù)組的地址和指針概念利用字符指針存取字符串;難點(diǎn):字符數(shù)組和字符指針的區(qū)別與聯(lián)系指針數(shù)組應(yīng)用;難點(diǎn):指向數(shù)組的指針與指針數(shù)組的區(qū)別帶參數(shù)的main函數(shù);。。。。。ProgrammingInC組織數(shù)據(jù)-----2.指針(地址)指針的概念;Program一、指針的概念變量與地址程序中:inti;
floatk;
內(nèi)存中每個(gè)字節(jié)有一個(gè)編號(hào)-----地址…...…...2000200120022005內(nèi)存02003ik
編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元變量是對(duì)程序中數(shù)據(jù)存儲(chǔ)空間的抽象ProgrammingInC一、指針的概念程序中:inti;內(nèi)存中內(nèi)存單元與地址main(){chara;intb;floatc;intd[3];intmax();
……}地址ProgrammingInC內(nèi)存單元與地址main()地址ProgrammingIn…...…...2000200420062005整型變量i10變量i_pointer200120022003指針與指針變量指針:一個(gè)變量的地址指針變量:專門(mén)存放變量地址的變量2000指針指針變量變量的內(nèi)容
變量的地址指針變量變量變量地址(指針)變量值指向地址存入指針變量ProgrammingInC…...…...2000200420062005整型變量i1&與*運(yùn)算符含義含義:取變量的地址單目運(yùn)算符優(yōu)先級(jí):2結(jié)合性:自右向左含義:取指針?biāo)赶蜃兞康膬?nèi)容單目運(yùn)算符優(yōu)先級(jí):2結(jié)合性:自右向左兩者關(guān)系:互為逆運(yùn)算理解…...…...2000200420062005整型變量i10變量i_pointer2001200220032000指針變量i_pointer-----指針變量,它的內(nèi)容是地址量*i_pointer----指針的目標(biāo)變量,它的內(nèi)容是數(shù)據(jù)&i_pointer---指針變量占用內(nèi)存的地址200010i_pointer*i_pointer&i_pointeriProgrammingInC&與*運(yùn)算符含義:取變量的地址含義:取指針?biāo)赶蜃兞康膬?nèi)直接訪問(wèn)與間接訪問(wèn)直接訪問(wèn):按變量地址存取變量值間接訪問(wèn):通過(guò)存放變量地址的變量去訪問(wèn)變量例i=3;-----直接訪問(wèn)指針變量…...…...2000200420062005整型變量i10變量i_pointer20012002200320003例*i_pointer=20;-----間接訪問(wèn)20ProgrammingInC直接訪問(wèn)與間接訪問(wèn)例i=3;---指針變量…...…...2000200420062005整型變量i10變量i_pointer2001200220032000整型變量k例k=i;--直接訪問(wèn)k=*i_pointer;--間接訪問(wèn)10例k=i;k=*i_pointer;ProgrammingInC指針變量…...…...2000200420062005整型指針變量指針變量與其所指向的變量之間的關(guān)系指針變量的定義一般形式:數(shù)據(jù)類型*指針名;3變量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=33變量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=3合法標(biāo)識(shí)符指針的目標(biāo)變量的數(shù)據(jù)類型表示定義指針變量不是‘*’運(yùn)算符例
int
*p1,*p2;float*q;注意:1、int*p1,*p2;
與int*p1,p2;2、指針變量名是p1,p2,不是*p1,*p23、指針變量只能指向定義時(shí)所規(guī)定類型的變量4、指針變量定義后,變量值不確定,應(yīng)用前必須先賦值ProgrammingInC指針變量指針變量的定義3變量i2000i_pointer*i指針變量的初始化一般形式:數(shù)據(jù)類型*指針名=初始地址值;賦給指針變量,不是賦給目標(biāo)變量例
inti;int*p=&i;變量必須已說(shuō)明過(guò)類型應(yīng)一致例int*p=&i;
inti;例
inti;int*p=&i;int*q=p;用已初始化指針變量作初值ProgrammingInC指針變量的初始化賦給指針變量,例inti;變量必須已例
main(){inti=10;int*p;
*p=i;printf(“%d”,*p);}危險(xiǎn)!例main(){inti=10,k;int*p;
p=&k;*p=i;printf(“%d”,*p);}指針變量必須先賦值,再使用…...…...2000200420062005整型變量i10指針變量p200120022003隨機(jī)ProgrammingInC例main()危險(xiǎn)!例main()指針變零指針與空類型指針零指針:(空指針)定義:指針變量值為零表示:
int*p=0;
p指向地址為0的單元,系統(tǒng)保證該單元不作它用表示指針變量值沒(méi)有意義#defineNULL0int*p=NULL:p=NULL與未對(duì)p賦值不同用途:避免指針變量的非法引用在程序中常作為狀態(tài)比較例int*p;......while(p!=NULL){...…}void*類型指針表示:void*p;使用時(shí)要進(jìn)行強(qiáng)制類型轉(zhuǎn)換例char*p1;void*p2;p1=(char*)p2;p2=(void*)p1;表示不指定p是指向哪一種類型數(shù)據(jù)的指針變量ProgrammingInC零指針與空類型指針p指向地址為0的單元,#define例指針的概念main(){inta;
int*pa=&a;a=10;printf("a:%d\n",a);printf("*pa:%d\n",*pa);printf("&a:%x(hex)\n",&a);printf("pa:%x(hex)\n",pa);printf("&pa:%x(hex)\n",&pa);}運(yùn)行結(jié)果:a:10*pa:10&a:f86(hex)pa:f86(hex)&pa:f88(hex)…...…...f86f8af8cf8b整型變量a10指針變量paf87f88f89f86ProgrammingInC例指針的概念main()運(yùn)行結(jié)果:…...…...f86例輸入兩個(gè)數(shù),并使其從大到小輸出/*1-0*/main(){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);}運(yùn)行結(jié)果:a=5,b=9max=9,min=5…...…...指針變量p1指針變量p20002008200220042006
指針變量p2
整型變量b
整型變量a5200692008200620082006ProgrammingInC例輸入兩個(gè)數(shù),并使其從大到小輸出/*1-0*/main(二、指針與數(shù)組指向數(shù)組元素的指針變量例intarray[10];int*p;
p=&array[0];//p=array;或int*p=&array[0];或int*p=array;array[0]array[1]array[2]array[3]array[9]...整型指針p&array[0]p數(shù)組名是表示數(shù)組首地址的地址常量ProgrammingInC二、指針與數(shù)組指針的運(yùn)算指針變量的賦值運(yùn)算p=&a;(將變量a地址p)p=array;(將數(shù)組array首地址p)p=&array[i];(將數(shù)組元素地址p)p1=p2;(指針變量p2值p1)不能把一個(gè)整數(shù)p,也不能把p的值整型變量如inti,*p;p=1000;()i=p;()指針變量與其指向的變量具有相同數(shù)據(jù)類型ProgrammingInC指針的運(yùn)算如inti,*p;指針變量與其指針的算術(shù)運(yùn)算:pipid(i為整型數(shù),d為p指向的變量所占字節(jié)數(shù))p++,p--,p+i,p-i,p+=i,p-=i等若p1與p2指向同一數(shù)組,p1-p2=兩指針間元素個(gè)數(shù)(p1-p2)/dp1+p2無(wú)意義例p指向float數(shù),則p+1p+14例p指向int型數(shù)組,且p=&a[0];則p+1指向a[1]例inta[10];int*p=&a[2];p++;*p=1;例inta[10];int*p1=&a[2];int*p2=&a[5];
則:p2-p1=3;a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a數(shù)組pp+1,a+1p+i,a+ip+9,a+91ProgrammingInC指針的算術(shù)運(yùn)算:例p指向float數(shù),則p+1p指針變量的關(guān)系運(yùn)算若p1和p2指向同一數(shù)組,則p1<p2表示p1指的元素在前p1>p2表示p1指的元素在后p1==p2表示p1與p2指向同一元素若p1與p2不指向同一數(shù)組,比較無(wú)意義p==NULL或p!=NULLProgrammingInC指針變量的關(guān)系運(yùn)算ProgrammingInC數(shù)組元素表示方法inta[10],*p=a;a[0]a[1]a[2]a[3]a[9]...aa+9a+1a+2地址元素下標(biāo)法a[0]a[1]a[2]a[9]a[0]a[1]a[2]a[3]a[9]...pp+9p+1p+2地址元素指針?lè)?p*(p+1)*(p+2)*(p+9)[]變址運(yùn)算符a[i]
*(a+i)a[i]p[i]*(p+i)*(a+i)*a*(a+1)*(a+2)*(a+9)p[0]p[1]p[2]p[9]ProgrammingInC數(shù)組元素表示方法inta[10],*p=a;a[0a[0]a[1]a[2]a[3]a[4]例數(shù)組元素的引用方法main(){inta[5],*pa,i;for(i=0;i<5;i++) a[i]=i+1;pa=a;for(i=0;i<5;i++) printf("*(pa+%d):%d\n",i,*(pa+i));for(i=0;i<5;i++) printf("*(a+%d):%d\n",i,*(a+i));for(i=0;i<5;i++) printf("pa[%d]:%d\n",i,pa[i]);for(i=0;i<5;i++) printf("a[%d]:%d\n",i,a[i]);}12345paProgrammingInCa[0]a[1]a[2]a[3]a[4]例數(shù)組元素的引main(){inti,*p,a[7];p=a;for(i=0;i<7;i++)scanf("%d",p++);printf("\n");for(i=0;i<7;i++,p++)printf("%d",*p);}例注意指針的當(dāng)前值p=a;pp58762730123456apppppp指針變量可以指到數(shù)組后的內(nèi)存單元ProgrammingInCmain()例注意指針的當(dāng)前值p=a;pp5876273一級(jí)指針變量與一維數(shù)組的關(guān)系int*p與intq[10]數(shù)組名是指針(地址)常量p=q;p+i是q[i]的地址數(shù)組元素的表示方法:下標(biāo)法和指針?lè)?,即若p=q,則
p[i]q[i]*(p+i)*(q+i)
形參數(shù)組實(shí)質(zhì)上是指針變量,即intq[]int*q在定義指針變量(不是形參)時(shí),不能把int*p寫(xiě)成intp[];系統(tǒng)只給p分配能保存一個(gè)指針值的內(nèi)存區(qū)(一般2字節(jié));而給q分配2*10字節(jié)的內(nèi)存區(qū)ProgrammingInC一級(jí)指針變量與一維數(shù)組的關(guān)系ProgrammingIn三、指針與二維數(shù)組二維數(shù)組的地址對(duì)于一維數(shù)組:(1)數(shù)組名array表示數(shù)組的首地址,即array[0]的地址;(2)數(shù)組名array是地址常量(3)array+i是元素array[i]的地址(4)array[i]*(array+i)arrayintarray[10];ProgrammingInC三、指針與二維數(shù)組對(duì)于一維數(shù)組:arrayint對(duì)于二維數(shù)組:(1)a是數(shù)組名,
包含三個(gè)元素a[0],a[1],a[2](2)每個(gè)元素a[i]
又是一個(gè)一維
數(shù)組,包含4個(gè)
元素aa+1a+2*(*(a+0)+1)*(a[0]+1)inta[3][4];a[0]a[1]a[2]200020082016200020022008201020162018a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]基類型行指針與列指針a[0]+1a[1]+1a[2]+1*(a+0)+1*(a+1)+1*(a+2)+1ProgrammingInC對(duì)于二維數(shù)組:aa+1a+2*(*(a+0)+1)*(a[0對(duì)二維數(shù)組inta[3][4],有a-----二維數(shù)組的首地址,即第0行的首地址a+i-----第i行的首地址a[i]*(a+i)------第i行第0列的元素地址a[i]+j*(a+i)+j-----第i行第j列的元素地址*(a[i]+j)*(*(a+i)+j)a[i][j]a+i=&a[i]=a[i]=*(a+i)=&a[i][0],值相等,含義不同a+i&a[i],表示第i行首地址,指向行a[i]*(a+i)&a[i][0],表示第i行第0列元素地址,指向列inta[3][4];a[0]a[1]a[2]200020082016200020022008201020162018a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]aa+1a+2ProgrammingInC對(duì)二維數(shù)組inta[3][4],有a+i=&a[i]inta[3][4];a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]a[0][2]a[0][3]a[1][2]a[1][3]a[2][2]a[2][3]二維數(shù)組元素表示形式:(1)a[1][2](2)*(a[1]+2)(3)*(*(a+1)+2)(4)*(&a[0][0]+1*4+2)地址表示:(1)a+1
(2)&a[1][0](3)a[1](4)*(a+1)(5)(int*)(a+1)行指針列指針地址表示:(1)&a[1][2](2)a[1]+2(3)*(a+1)+2(4)&a[0][0]+1*4+2ProgrammingInCinta[3][4];a[0][0]a[0][1]a[1表示形式含義地址a二維數(shù)組名,數(shù)組首地址a[0],*(a+0),*a第0行第0列元素地址a+1第1行首地址a[1],*(a+1)第1行第0列元素地址a[1]+2,*(a+1)+2,&a[1
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 ISO 10713:2025 EN Jewellery and precious metals - Gold alloy coatings
- T-ZHAQ 8-2024 小葉牛大力種植技術(shù)規(guī)程
- 二零二五年度應(yīng)屆大學(xué)生人力資源實(shí)習(xí)合同
- 二零二五年度股票投資風(fēng)險(xiǎn)控制與合規(guī)監(jiān)督協(xié)議
- 二零二五年度個(gè)人債權(quán)轉(zhuǎn)讓協(xié)議書(shū)(關(guān)于專利權(quán)轉(zhuǎn)讓)
- 高管二零二五年度勞動(dòng)合同及離職交接程序
- 二零二五年度路橋工程土地征用與拆遷合同
- 美容院合伙人投資回報(bào)與風(fēng)險(xiǎn)控制協(xié)議書(shū)(2025年度)
- 2025年度金融借款合同違約起訴流程及費(fèi)用結(jié)算合同
- 2025年度餐飲企業(yè)跨界合作合伙經(jīng)營(yíng)合同
- (正式版)CB∕T 4548-2024 船舶行業(yè)企業(yè)相關(guān)方安全管理要求
- 部編版八年級(jí)物理(上冊(cè))期末試卷(帶答案)
- 《衡水內(nèi)畫(huà)》課程標(biāo)準(zhǔn)
- DB32T 4400-2022《飲用水次氯酸鈉消毒技術(shù)規(guī)程》
- 化學(xué)品(氬氣+二氧化碳混合氣)安全技術(shù)使用說(shuō)明書(shū)
- 煤層氣開(kāi)發(fā)-第2章-煤層氣地質(zhì)
- 美羅華(利妥昔單抗)課件
- 稅務(wù)簡(jiǎn)易注銷課件
- 人教版五年級(jí)數(shù)學(xué)下冊(cè)第六單元分層作業(yè)設(shè)計(jì)
- 肺葉切除術(shù)和全肺切除術(shù)的麻醉課件
- 智能制造在食品加工業(yè)的應(yīng)用
評(píng)論
0/150
提交評(píng)論