4.8數組與指針基礎-專題輔導課件_第1頁
4.8數組與指針基礎-專題輔導課件_第2頁
4.8數組與指針基礎-專題輔導課件_第3頁
4.8數組與指針基礎-專題輔導課件_第4頁
4.8數組與指針基礎-專題輔導課件_第5頁
已閱讀5頁,還剩54頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

C程序設計專題輔導課

數組與指針基礎數組定義:類型名

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

inta[10]={1,2,3};staticb[2][3]={{1,2}};intc[]={1,2,3,4};intx[][2]={1,2,3};部分元素初始化:其余元素的值動態存儲為隨機數,靜態存儲自動為0數組數組的使用:

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

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

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

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

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

Happy\0對字符串的操作把字符串放入一維字符數組(存儲)對字符串的操作===>對字符數組的操作普通字符數組:數組元素的個數是確定的,一般用下標控制循環字符串:沒有顯式地給出有效字符的個數,只規定在字符串結束符

'\0'

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

'\0'

來控制循環循環條件:s[i]!='\0'

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

A、a[3][2]

B、a[1][3]

C、a[1][2]

D、a[2][3]B舉例(2)下列關于數組的定義,哪種說法是錯誤的()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數組名代表數組的首地址舉例(4)

設變量定義為

chars[]="hello\nworld\n";,則數組s中有______個元素。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個數,用選擇法將它們從小到大排序后輸出。設n=535281(1)15283(2)2583(3)385(4)5835281(n=5)5個數(a[0]~a[4])中找最小數,與a[0]交換(1)15283a[4]<==>a[0]4個數(a[1]~a[4])中找最小數,與a[1]交換(2)12583a[2]<==>a[1]3個數(a[2]~a[4])中找最小數,與a[2]交換(3)12385a[4]<==>a[2]2個數(a[3]~a[4])中找最小數,與a[3]交換(4)12358a[4]<==>a[3]選擇法(1)冒泡法排序35281輸入n(n<10),再輸入n個數,用冒泡法將它們從小到大排序后輸出。設n=53528135281(n=5)逐個進行相鄰的數比較,將大數交換到后一位32518(2)32512315(3)231213(4)211212358冒泡法舉例(5)若輸入89762425981116354<回車>,則以下程序的輸出結果是_______。#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,按偶數、奇數分成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?<回車>后,下列程序的輸出結果是_______。#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)程序填空,不要改變與輸入輸出有關的語句。輸入一個正整數repeat(0<repeat<10),做repeat次下列運算:輸入一個以回車結束的字符串(少于80個字符),濾去所有的非十六進制字符后,組成一個新字符串(十六進制形式),然后將其轉換為十進制數后輸出。輸入輸出示例:括號內為說明輸入: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);}}

指針基礎

內容提要

指針&地址&數據的訪問機制指針變量指針&函數指針&一維數組指針&動態數組指針&地址&數據的訪問機制地址內存單元1

23…

n…

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

…20081000(addr)p是一個指針類型的變量指向指針&地址&數據的訪問機制要點:指針是一種指向其他數據對象的數據類型,通過保存其他數據對象的存儲地址,可以指向任意類型的數據,從而提供一種對數據間接訪問的機制。指針是內存單元的地址,但更準確的應該是特定類型存儲單元的地址,它不是指向一個抽象的存儲地址,而是指向具有明確類型的存儲單元。指針變量—指針變量的定義類型名*

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

要點

inta,*p;float*f;char*c;指針變量2.指針變量中保存的是其他數據的存儲地址,因此對指針變量的賦值往往與取地址的一元運算符&同時使用,而對指向數據的間接訪問則通過一元的間接訪問運算符*實現。要點

intx=5,*px;

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

pxx(or*px)&x5

指針變量2.指針變量中保存的是其他數據的存儲地址,因此對指針變量的賦值往往與取地址的一元運算符&同時使用,而對指向數據的間接訪問則通過一元的間接訪問運算符*實現。指針在沒有指向具體的數據對象之前,不能夠進行*運算。要點指針變量3.指針類型是所指向數據的類型。對編程者是一種檢驗手段,說明編程者使用這個指針對什么樣的數據進行操作;對編譯系統而言,主要用來獲取指針所指數據類型的長度,并以此確定指針單位增量的長度,以便在對指針的內容進行增減是得出正確的結果。

因此一般情況下不同類型的指針既不能相互轉換,也不能相互賦值。要點指針變量—指針的初始化1.可以用取已定義的同類型的變量的地址對指針變量初始化;2.可以用NULL對指針變量初始化;要點指針變量—指針運算合法的運算包括:相同類型指針的賦值、指針值的整數增減、指向同一數組中元素的指針相減、指針的比較、強制類型轉換以及經過合法強制類型轉換的指針賦值。要點指針&函數—指針作為函數參數1.通過指針方式傳遞數組、結構等大型參數以避免直接傳遞大量的數據;2.通過指針操作的方式繞開函數參數的值傳遞方式所帶來的限制,使函數可以從內部直接對函數外部的變量進行操作,還可以達到返回多個值的作用。要點例:輸入年和天數,輸出對應的年、月、日。例如:輸入2000和61,輸出2000-3-1。定義函數month_day(year,yearday,*pmonth,*pday)用2個指針作為函數的參數,帶回2個結果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指針&一維數組—指針和數組的互換

df08df08

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

printf(“%x%x”,a,&a[0]);}a[0]a[1]a[2]a數組名是數組首元素的指針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]指針運算可以代替數組的下標運算來確定數組中的元素,數組下標的任何運算都可以用指針實現。類似的,以數組的語法是喲個指針在語法上也是合法的。1.數據元素的引用方式:

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

(2)指針法:*(a+3),*p;2.越界控制由程序員控制3.數組是連續的存儲空間,而指針只是一個保存地址的存儲單元。數組名是常量,而非指針變量要點

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

p=a;p++;

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

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

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

voidmain(){

inta[10];

int*p;......p=a;f(p,10);......}數組名做為函數的參數,在函數調用時,將實參數組首元素的地址傳給形參(指針變量),因此,形參也指向實參數組的首元素。如果改變形參所指向單元的值,就是改變實參數組首元素的值。或:形參數組和實參數組共用同一段存貯空間,如果形參數組中元素的值發生變化,實參數組中元素的值也同時發生變化。要點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復制字符數組擁有連續的內存單元,數組名永遠指向數組的首元素;若要改變數組所代表的字符串,只能改變數組元素的內容指針&一維數組—字符數組和字符指針Th..........gtchar*str=“Thisisastring”;charsa[]=“hello”;str=sa;str=“newstring”;字符指針變量可以指向不同的字符;若要改變指針所代表的字符串,通常直接改變指針的值,讓它指向新的字符串\0Thisisastringstrhello\0sastr,newstringstr\0hello\0char*s;scanf(“%s”,s);char*s,str[20];s=str;scanf(“%s”,s);字符指針-先賦值,后引用輸入的字符串實際存放在字符數組str中char*str,*format;str=“IloveChina”;str=str+7;printf(“%s”,str);printf(“%c”,str[-3]);format=“%s”;printf(format,str-7);IloveChinastr\0ChinavIloveChina指針&一維數組—字符串函數1、字符串的輸入和輸出(stdio.h)輸入函數以字符數組名(或指向數組首元素的指針變量,下同)為參數

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

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

printf("%s",str)

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

puts(str)

puts("hello");

puts輸出字符串后自動換行,而printf不換行2、字符串的復制、連接、比較、求字符串長度

(string.h

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

溫馨提示

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

評論

0/150

提交評論