4.8數(shù)組與指針基礎(chǔ)-專題輔導(dǎo)課件_第1頁(yè)
4.8數(shù)組與指針基礎(chǔ)-專題輔導(dǎo)課件_第2頁(yè)
4.8數(shù)組與指針基礎(chǔ)-專題輔導(dǎo)課件_第3頁(yè)
4.8數(shù)組與指針基礎(chǔ)-專題輔導(dǎo)課件_第4頁(yè)
4.8數(shù)組與指針基礎(chǔ)-專題輔導(dǎo)課件_第5頁(yè)
已閱讀5頁(yè),還剩54頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C程序設(shè)計(jì)專題輔導(dǎo)課

數(shù)組與指針基礎(chǔ)數(shù)組定義:類型名

數(shù)組名[數(shù)組長(zhǎng)度]inta[10],x[5][5];#defineN5main(){intb[N];}inti=10;intc[i];數(shù)組初始化:

inta[10]={1,2,3};staticb[2][3]={{1,2}};intc[]={1,2,3,4};intx[][2]={1,2,3};部分元素初始化:其余元素的值動(dòng)態(tài)存儲(chǔ)為隨機(jī)數(shù),靜態(tài)存儲(chǔ)自動(dòng)為0數(shù)組數(shù)組的使用:

inta[10],i;使a的所有元素值為1;

a=1;for(i=0;i<10;i++)a[i]=1;二維數(shù)組在內(nèi)存中的存放方式inta[3][2];3行2列,6個(gè)元素表示1個(gè)3行2列的矩陣a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]二維數(shù)組的元素在內(nèi)存中按行/列方式存放a[0][0]a[0][1]a[1][0]a[1][1]a[2][0]a[2][1]二維數(shù)組在內(nèi)存中的存放方式

inta[M][N],i,j;a[0][0]的地址是數(shù)組a在內(nèi)存中存放的首(起始)地址a[i][j]距離起始地址的距離(偏移量)為:i*N+jinta[3][2];a[0][2],a[1][0]代表同一個(gè)數(shù)組元素字符串字符串常量用一對(duì)雙引號(hào)括起來(lái)的字符序列一個(gè)字符串結(jié)束符'\0'"Happy"6個(gè)字符'H''a’'p’'p’'y''\0'有效字符字符串結(jié)束符字符串的有效長(zhǎng)度:有效字符的個(gè)數(shù)strlen(s);返回字符數(shù)組s的字符串有效長(zhǎng)度字符串的存儲(chǔ)-數(shù)組初始化字符串可以存放在一維字符數(shù)組中

staticchars[6]={'H','a','p','p','y','\0'};字符數(shù)組初始化:用字符串常量staticchars[6]={"Happy"};staticchars[6]="Happy";chars[]="Happy";

s[0]s[1]s[5]s

Happy\0對(duì)字符串的操作把字符串放入一維字符數(shù)組(存儲(chǔ))對(duì)字符串的操作===>對(duì)字符數(shù)組的操作普通字符數(shù)組:數(shù)組元素的個(gè)數(shù)是確定的,一般用下標(biāo)控制循環(huán)字符串:沒有顯式地給出有效字符的個(gè)數(shù),只規(guī)定在字符串結(jié)束符

'\0'

之前的字符都是字符串的有效字符,一般用結(jié)束符

'\0'

來(lái)控制循環(huán)循環(huán)條件:s[i]!='\0'

舉例(1)1.數(shù)組定義為inta[3][2]={1,2,3,4,5,6},數(shù)組元素_____的值為6。

A、a[3][2]

B、a[1][3]

C、a[1][2]

D、a[2][3]B舉例(2)下列關(guān)于數(shù)組的定義,哪種說(shuō)法是錯(cuò)誤的()A.inta[1][3];B.intx[2][2]={1,2,3,4};C.intx[2][]={1,2,4,6}; D.intm[][3]={1,2,3,4,5,6};下列代碼段的輸出為()

staticinta[3][4]={{1,2,3},{4,5,6}};

printf(“%d”,a[0][5]);C5舉例(3)不正確的賦值或賦初值的方式是______。

A、charstr[]="string";

B、charstr[7]={'s','t','r','i','n','g'};

C、charstr[10];str="string";D、charstr[7]={'s','t','r','i','n','g',’\0’};C數(shù)組名代表數(shù)組的首地址舉例(4)

設(shè)變量定義為

chars[]="hello\nworld\n";,則數(shù)組s中有______個(gè)元素。A、12B、13C、14D、15下列代碼段的輸出為()

charc[]=“I\t\r\\\0will\n”;

printf(“%d”,strlen(c));A.4B.10 C.11D.15BA舉例(5)下列代碼段的輸出為()#include<stdio.h>#include<string.h>main(){

charst[20]=”hello%d\0world!”;

printf(“%d,%d\n”,strlen(st),sizeof(st));}7,20選擇法排序35281輸入n(n<10),再輸入n個(gè)數(shù),用選擇法將它們從小到大排序后輸出。設(shè)n=535281(1)15283(2)2583(3)385(4)5835281(n=5)5個(gè)數(shù)(a[0]~a[4])中找最小數(shù),與a[0]交換(1)15283a[4]<==>a[0]4個(gè)數(shù)(a[1]~a[4])中找最小數(shù),與a[1]交換(2)12583a[2]<==>a[1]3個(gè)數(shù)(a[2]~a[4])中找最小數(shù),與a[2]交換(3)12385a[4]<==>a[2]2個(gè)數(shù)(a[3]~a[4])中找最小數(shù),與a[3]交換(4)12358a[4]<==>a[3]選擇法(1)冒泡法排序35281輸入n(n<10),再輸入n個(gè)數(shù),用冒泡法將它們從小到大排序后輸出。設(shè)n=53528135281(n=5)逐個(gè)進(jìn)行相鄰的數(shù)比較,將大數(shù)交換到后一位32518(2)32512315(3)231213(4)211212358冒泡法舉例(5)若輸入89762425981116354<回車>,則以下程序的輸出結(jié)果是_______。#include"stdio.h"#defineN10main(){

intx[N],y1[N],y2[N];

inti,j,n1,n2,t,p;n1=n2=0;

for(i=0;i<N;i++){

scanf(“%d”,&x[i]);if(x[i]%2==0)y1[n1++]=x[i];elsey2[n2++]=x[i];}

for(i=1;i<n1;i++)

for(j=0;j<n1-i;j++)if(y1[j]>y1[j+1]){ t=y1[j];y1[j]=y1[j+1];y1[j+1]=t;}

for(i=0;i<n2-1;i++){p=i;for(j=i+1;j<n2;j++)if(y2[p]<y2[j])p=j;

if(p!=i){t=y2[i];y2[i]=y2[p];y2[p]=t;}}

for(i=0;i<n1;i++)printf("%d,",y1[i]);

for(i=0;i<n2;i++)printf("%d,",y2[i]);}4,8,16,24,76,89,35,25,11,9,按偶數(shù)、奇數(shù)分成y1,y2冒泡法,從小到大選擇法,從大到小舉例(6)1.若輸入為398653712421234<ENTER>,則輸出為()#include"stdio.h"voidmain(){

intflag,i,j,k,col,n,ri,a[6][6];

for(ri=1;ri<=2;ri++){

scanf("%d",&n);

for(i=0;i<n;i++)

for(j=0;j<n;j++)

scanf("%d",&a[i][j]);flag=0;

for(i=0;i<n;i++){

col=0;

for(j=0;j<n;j++) if(a[i][col]<a[i][j])col=j;

for(k=0;k<n;k++)

if(a[i][col]<a[k][col])

break;

if(k>=n){

printf("a[%d][%d]=%d#",i,col,a[i][col]);

flag=1;

}

}

if(!flag)printf("NO#");

}}一行中最大的元素是否是同列中最大a[0][0]=9#a[1][2]=7#a[1][1]=4舉例(7)1.輸入123+234=357Yes?<回車>后,下列程序的輸出結(jié)果是_______。#include<stdio.h>voidmain(){intk,n1,n3[10];charc;n1=0;for(k=0;k<10;k++)n3[k]=0;while((c=getchar())!='\n'){switch(c){case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9': n3[c-'0']++; break;default: n1++; break;}}if(n1)printf("%d",n1);for(k=0;k<10;k++)if(n3[k])printf("%d",n3[k]);}6123111123+n3[1]=1n3[2]=1n3[3]=1n1=1234=n3[2]=2n3[3]=2n3[4]=1n1=2舉例(8)程序填空,不要改變與輸入輸出有關(guān)的語(yǔ)句。輸入一個(gè)正整數(shù)repeat(0<repeat<10),做repeat次下列運(yùn)算:輸入一個(gè)以回車結(jié)束的字符串(少于80個(gè)字符),濾去所有的非十六進(jìn)制字符后,組成一個(gè)新字符串(十六進(jìn)制形式),然后將其轉(zhuǎn)換為十進(jìn)制數(shù)后輸出。輸入輸出示例:括號(hào)內(nèi)為說(shuō)明輸入:2 (repeat=2)10+A輸出:Dec=16Dec=10#include"stdio.h"#include"string.h"#defineMAXLEN80intmain(void){charch;charstr[MAXLEN],num[MAXLEN];

inti,k,t;

intrepeat,ri;longnumber;

scanf("%d",&repeat);

getchar();

for(ri=1;ri<=repeat;ri++){i=0;

while((ch=getchar())!='\n'){

str[i]=ch;i++;}

str[i]=0; t=0; for(k=0;k<i;k++)

if((str[k]>='0'&&str[k]<='9')||(str[k]>='a'&&str[k]<='f')||(str[k]>='A'&&str[k]<='F')){ num[t]=str[k]; t++; } num[t]='\0'; number=0; for(i=0;num[i]!='\0';i++){ if(num[i]>='0'&&num[i]<='9'){ number=number*16+(num[i]-'0');} else{ if(num[i]>='a'&&num[i]<='f') number=number*16+(num[i]-'a'+10); else number=number*16+(num[i]-'A'+10);break;} }

printf("Dec=%ld\n",number);}}

指針基礎(chǔ)

內(nèi)容提要

指針&地址&數(shù)據(jù)的訪問(wèn)機(jī)制指針變量指針&函數(shù)指針&一維數(shù)組指針&動(dòng)態(tài)數(shù)組指針&地址&數(shù)據(jù)的訪問(wèn)機(jī)制地址內(nèi)存單元1

23…

n…

n+1…intx=20,y=1;chararray[3];array[0]=‘a(chǎn)’;array[1]=array[0]+2;array[2]=‘b’;指針&地址&數(shù)據(jù)的訪問(wèn)機(jī)制地址內(nèi)存單元100020x10021y1004‘a(chǎn)’array[0]1005‘c’array[1]1006‘b’array[2]intx=20,y=1;chararray[3];array[0]=‘a(chǎn)’;array[1]=array[0]+2;array[2]=‘b’;數(shù)據(jù)的直接訪問(wèn)指針&地址&數(shù)據(jù)的訪問(wèn)機(jī)制地址內(nèi)存單元intx=20,y=1;……數(shù)據(jù)的間接訪問(wèn)100020x

…20081000(addr)p是一個(gè)指針類型的變量指向指針&地址&數(shù)據(jù)的訪問(wèn)機(jī)制要點(diǎn):指針是一種指向其他數(shù)據(jù)對(duì)象的數(shù)據(jù)類型,通過(guò)保存其他數(shù)據(jù)對(duì)象的存儲(chǔ)地址,可以指向任意類型的數(shù)據(jù),從而提供一種對(duì)數(shù)據(jù)間接訪問(wèn)的機(jī)制。指針是內(nèi)存單元的地址,但更準(zhǔn)確的應(yīng)該是特定類型存儲(chǔ)單元的地址,它不是指向一個(gè)抽象的存儲(chǔ)地址,而是指向具有明確類型的存儲(chǔ)單元。指針變量—指針變量的定義類型名*

指針變量名;1.指針變量名不包括*

要點(diǎn)

inta,*p;float*f;char*c;指針變量2.指針變量中保存的是其他數(shù)據(jù)的存儲(chǔ)地址,因此對(duì)指針變量的賦值往往與取地址的一元運(yùn)算符&同時(shí)使用,而對(duì)指向數(shù)據(jù)的間接訪問(wèn)則通過(guò)一元的間接訪問(wèn)運(yùn)算符*實(shí)現(xiàn)。要點(diǎn)

intx=5,*px;

px=&x; /*意味著:px指向x*/

pxx(or*px)&x5

指針變量2.指針變量中保存的是其他數(shù)據(jù)的存儲(chǔ)地址,因此對(duì)指針變量的賦值往往與取地址的一元運(yùn)算符&同時(shí)使用,而對(duì)指向數(shù)據(jù)的間接訪問(wèn)則通過(guò)一元的間接訪問(wèn)運(yùn)算符*實(shí)現(xiàn)。指針在沒有指向具體的數(shù)據(jù)對(duì)象之前,不能夠進(jìn)行*運(yùn)算。要點(diǎn)指針變量3.指針類型是所指向數(shù)據(jù)的類型。對(duì)編程者是一種檢驗(yàn)手段,說(shuō)明編程者使用這個(gè)指針對(duì)什么樣的數(shù)據(jù)進(jìn)行操作;對(duì)編譯系統(tǒng)而言,主要用來(lái)獲取指針?biāo)笖?shù)據(jù)類型的長(zhǎng)度,并以此確定指針單位增量的長(zhǎng)度,以便在對(duì)指針的內(nèi)容進(jìn)行增減是得出正確的結(jié)果。

因此一般情況下不同類型的指針既不能相互轉(zhuǎn)換,也不能相互賦值。要點(diǎn)指針變量—指針的初始化1.可以用取已定義的同類型的變量的地址對(duì)指針變量初始化;2.可以用NULL對(duì)指針變量初始化;要點(diǎn)指針變量—指針運(yùn)算合法的運(yùn)算包括:相同類型指針的賦值、指針值的整數(shù)增減、指向同一數(shù)組中元素的指針相減、指針的比較、強(qiáng)制類型轉(zhuǎn)換以及經(jīng)過(guò)合法強(qiáng)制類型轉(zhuǎn)換的指針賦值。要點(diǎn)指針&函數(shù)—指針作為函數(shù)參數(shù)1.通過(guò)指針?lè)绞絺鬟f數(shù)組、結(jié)構(gòu)等大型參數(shù)以避免直接傳遞大量的數(shù)據(jù);2.通過(guò)指針操作的方式繞開函數(shù)參數(shù)的值傳遞方式所帶來(lái)的限制,使函數(shù)可以從內(nèi)部直接對(duì)函數(shù)外部的變量進(jìn)行操作,還可以達(dá)到返回多個(gè)值的作用。要點(diǎn)例:輸入年和天數(shù),輸出對(duì)應(yīng)的年、月、日。例如:輸入2000和61,輸出2000-3-1。定義函數(shù)month_day(year,yearday,*pmonth,*pday)用2個(gè)指針作為函數(shù)的參數(shù),帶回2個(gè)結(jié)果intmain(void){

intday,month,year,yearday;voidmonth_day(int

year,int

yearday,int*pmonth,int*pday);

printf(“inputyearandyearday:”);

scanf("%d%d",&year,&yearday);

month_day(year,yearday,&month,&day);

printf("%d-%d-%d\n",year,month,day); return0; }voidmonth_day(intyear,int

yearday,int*pmonth,int*pday){intk,leap;

inttab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31},};

/*建立閏年判別條件leap*/leap=(year%4==0&&year%100!=0)||year%400==0;

for(k=1;yearday>tab[leap][k];k++)

yearday-=tab[leap][k];*pmonth=k;*pday=yearday;}inputyearandyearday:200061

2000-3-1monthdaypmonthpday31指針&一維數(shù)組—指針和數(shù)組的互換

df08df08

voidmain(){inta[3]={1,2,3};

printf(“%x%x”,a,&a[0]);}a[0]a[1]a[2]a數(shù)組名是數(shù)組首元素的指針aa+1a+ia+9a[0]a[1]a[9]a[i]&a[0]&a[1]&a[9]&a[i]inta[10];inta[10];int*p;p=&a[0];,p,,p+1,,p+i,,p+9,inta[10];int*p;p=a;inta[10];int*p=&a[0];inta[10];int*p=a;,*p,,*(p+1),,*(p+i),,*(p+9),

*a

*(a+1)

*(a+i)

*(a+9),p[0],p[1],p[9],p[i]指針運(yùn)算可以代替數(shù)組的下標(biāo)運(yùn)算來(lái)確定數(shù)組中的元素,數(shù)組下標(biāo)的任何運(yùn)算都可以用指針實(shí)現(xiàn)。類似的,以數(shù)組的語(yǔ)法是喲個(gè)指針在語(yǔ)法上也是合法的。1.數(shù)據(jù)元素的引用方式:

(1)下標(biāo)法:a[3],p[3];

(2)指針?lè)?*(a+3),*p;2.越界控制由程序員控制3.數(shù)組是連續(xù)的存儲(chǔ)空間,而指針只是一個(gè)保存地址的存儲(chǔ)單元。數(shù)組名是常量,而非指針變量要點(diǎn)

inta[10],*p;a=p;a++;a=a+3;

p=a;p++;

指針&一維數(shù)組—數(shù)組名作為實(shí)參的形參形式voidmain(){

inta[10];......f(a,10);......}

f(intx[],intn){......}f(int*x,intn){......}

voidmain(){

inta[10];

int*p;......p=a;f(p,10);......}數(shù)組名做為函數(shù)的參數(shù),在函數(shù)調(diào)用時(shí),將實(shí)參數(shù)組首元素的地址傳給形參(指針變量),因此,形參也指向?qū)崊?shù)組的首元素。如果改變形參所指向單元的值,就是改變實(shí)參數(shù)組首元素的值。或:形參數(shù)組和實(shí)參數(shù)組共用同一段存貯空間,如果形參數(shù)組中元素的值發(fā)生變化,實(shí)參數(shù)組中元素的值也同時(shí)發(fā)生變化。要點(diǎn)floataverage(float*array){inti;floataver,sum=0;for(i=0;i<10;i++)sum+=array[i];aver=sum/10;return(aver);}main(){floatscore[10],aver;

inti;for(i=0;i<10;i++)

scanf(“%f”,&score[i]);aver=average(score);

printf("%f\n",aver);}floatarray[10]floatarray[]floataverage(float*array){inti;floataver,sum=0;for(i=0;i<10;i++)sum+=array[i];aver=sum/10;return(aver);}score

score[0]score[9]array*(array+i)main(){floatscore[10],aver;

inti;for(i=0;i<10;i++)

scanf(“%f”,&score[i]);aver=average(score);

printf("%f\n",aver);}charsa[]=“Thisisastring”;sa[0]=‘t’;sa=“Hello”;sa[0]sa[1]sa[i]sa\0\0Thisisastring復(fù)制字符數(shù)組擁有連續(xù)的內(nèi)存單元,數(shù)組名永遠(yuǎn)指向數(shù)組的首元素;若要改變數(shù)組所代表的字符串,只能改變數(shù)組元素的內(nèi)容指針&一維數(shù)組—字符數(shù)組和字符指針Th..........gtchar*str=“Thisisastring”;charsa[]=“hello”;str=sa;str=“newstring”;字符指針變量可以指向不同的字符;若要改變指針?biāo)淼淖址ǔV苯痈淖冎羔樀闹?,讓它指向新的字符串\0Thisisastringstrhello\0sastr,newstringstr\0hello\0char*s;scanf(“%s”,s);char*s,str[20];s=str;scanf(“%s”,s);字符指針-先賦值,后引用輸入的字符串實(shí)際存放在字符數(shù)組str中char*str,*format;str=“IloveChina”;str=str+7;printf(“%s”,str);printf(“%c”,str[-3]);format=“%s”;printf(format,str-7);IloveChinastr\0ChinavIloveChina指針&一維數(shù)組—字符串函數(shù)1、字符串的輸入和輸出(stdio.h)輸入函數(shù)以字符數(shù)組名(或指向數(shù)組首元素的指針變量,下同)為參數(shù)

scanf("%s",str)遇回車或空格輸入結(jié)束,并自動(dòng)將輸入的一串字符和‘\0’送入數(shù)組中

gets(str)遇回車輸入結(jié)束,自動(dòng)將輸入的一串字符和‘\0’送入數(shù)組中指針&一維數(shù)組—字符串函數(shù)1、字符串的輸入和輸出(stdio.h)輸出函數(shù)以字符數(shù)組名或字符串常量為參數(shù),輸出遇'\0'結(jié)束

printf("%s",str)

printf("%s","hello");

puts(str)

puts("hello");

puts輸出字符串后自動(dòng)換行,而printf不換行2、字符串的復(fù)制、連接、比較、求字符串長(zhǎng)度

(string.h

)字符串復(fù)制:strcpy(str1,str2)字符串連接:strcat(str1,str2)字符串比較:strcmp(str1,str2)求

溫馨提示

  • 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ù)覽,若沒有圖紙預(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)論