




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第9章數(shù)組類型
9.1一維數(shù)組9.2二維數(shù)組9.3數(shù)組和函數(shù)9.4字符數(shù)組9.5指針數(shù)組9.1一維數(shù)組一維數(shù)組的定義一維數(shù)組的定義格式為:存儲類型數(shù)據(jù)類型數(shù)組名[數(shù)組長度];例如,語句“floata[6],b[10];”說明:數(shù)組的存儲類型可以是auto或static,但不能為register。數(shù)組的數(shù)據(jù)類型既可以是基本類型,也可以是構(gòu)造類型等。數(shù)組名應(yīng)符合標識符的命名規(guī)則,數(shù)組名代表的不是整個數(shù)組,而是數(shù)組所占內(nèi)存空間的起始地址。數(shù)組長度表示數(shù)組元素的個數(shù)。數(shù)組長度只能是整型常量或整型常量表達式。C編譯系統(tǒng)為數(shù)組分配連續(xù)的內(nèi)存單元。數(shù)組元素的相對次序由下標來表示。數(shù)組元素的下標是從0開始的整數(shù)。9.1一維數(shù)組一維數(shù)組的引用在C語言中不能引用整個數(shù)組,只能引用單個數(shù)組元素。一個數(shù)組元素就是相當于一個變量,它的使用與同類型的普通變量是相同的。一維數(shù)組元素的引用形式為:數(shù)組名[下標]數(shù)組名后方括號內(nèi)是數(shù)組下標,下標表示該元素是數(shù)組的第幾個元素。數(shù)組名后面的方括號內(nèi)的內(nèi)容只有在數(shù)組定義時才是數(shù)組的長度,其他時候都是數(shù)組下標。數(shù)組元素的下標是整型的常量、變量或表達式。下標的取值范圍是[0,數(shù)組長度-1]的整型值。C程序運行時,編譯系統(tǒng)并不檢查數(shù)組元素的下標是否越界,需要編程人員自己保證數(shù)組元素的下標不要越界。9.1一維數(shù)組一維數(shù)組的初始化如果在數(shù)組定義之后進行初始化操作,則只能對每個數(shù)組元素一一賦值。intarr[10],i;for(i=0;i<10;i++)arr[i]=i;如果在定義數(shù)組時完成數(shù)組的初始化操作,則需要將數(shù)組元素的初值依次放在一對花括弧中,并用賦值號與數(shù)組連接。定義數(shù)組時賦初值的形式為:存儲類型數(shù)據(jù)類型數(shù)組名[數(shù)組長度]={初值列表};花括弧內(nèi)各個初值之間用逗號分隔,數(shù)值類型必須與數(shù)組類型一致。系統(tǒng)將按初值的排列順序,順次給數(shù)組元素賦值。例如,語句“intarr[10]={0,1,2,3,4,5,6,7,8,9};”花括弧中初值的數(shù)量必須小于等于數(shù)組長度。當初值數(shù)量小于數(shù)組長度時,數(shù)值型數(shù)組的后面沒有初值的元素由系統(tǒng)自動賦值為0。9.1一維數(shù)組若給數(shù)組的所有元素賦初值,可以省略數(shù)組的長度。系統(tǒng)會根據(jù)所賦初值的個數(shù)確定數(shù)組的長度。例如,intarr[]={1,2,3,4,5,6,7,8,9};如果是auto存儲類型的數(shù)組未賦初值,數(shù)組元素的值是不確定的。而static存儲類型的數(shù)值型數(shù)組未賦初值,編譯系統(tǒng)會在編譯時將元素全部初始化為0。9.1一維數(shù)組一維數(shù)組應(yīng)用舉例【例9.1】求100個整數(shù)的平均值。#include“stdio.h”main(){inta[100],i;floatave,sum;printf("pleaseenter100numbers:\n");for(i=0;i<100;i++) /*輸入元素*/
scanf("%d",&a[i]);for(sum=0,i=0;i<100;i++) /*求和*/
sum=sum+a[i];
ave=sum/100;
/*求平均值*/
for(i=0;i<100;i++)printf("%6d",a[i]);
printf("\naverage=%7.2f",ave);}9.1一維數(shù)組【例9.2】編寫程序,找出10個整數(shù)中的最小值及其位置。解題思路:首先輸入10個整數(shù),然后找出其中的最小值及其位置,最后輸出結(jié)果。其中最主要的功能是求最小值及其位置,完成這一功能的主要步驟為:①假定最小值為第一個數(shù),也就是位置min為0;②將min位置的數(shù)和數(shù)組的下一個數(shù)進行比較,如果min位置上的數(shù)大,則更改min值為更小數(shù)的位置;③如果比較完數(shù)組中所有的數(shù),位置min上的數(shù)就是最小值,否則轉(zhuǎn)向②繼續(xù)執(zhí)行。假設(shè)數(shù)組x的10個數(shù)依次為3、2、7、1、4、8、5、11、4、9,則尋找最小值及其位置的過程應(yīng)該為:9.1一維數(shù)組9.1一維數(shù)組#include"stdio.h"main(){intx[10],i,min;
printf("pleaseenter10numbers:");
for(i=0;i<10;i++)/*輸入10個元素*/
scanf("%d",&x[i]);
min=0;
/*給min置初值*/
for(i=1;i<10;i++)/*從第1個元素開始查找最小值位置*/
if(x[i]<x[min])min=i;
printf("minimumisx[%d]=%d",min,x[min]);/*輸出最小值*/}輸入3、2、7、1、4、8、5、11、4、9的程序運行結(jié)果為:pleaseenter10numbers:32714851149↙minimumisx[3]=19.1一維數(shù)組【例9.3】采用選擇法對數(shù)列進行排序。解題思路:選擇法排序(設(shè)對N個數(shù)進行排序)是每次從待排序數(shù)據(jù)中選擇最小的數(shù),與相應(yīng)位置上的數(shù)交換。假設(shè)待排序的數(shù)列存放在一維數(shù)組a中,且找最小值位置的方法同例9.2,則選擇法排序的過程為:第一次從N個元素(a[0]到a[N])中找到最小值位置min,如果min不等于0,將a[min]與a[0]交換;第二次從剩下的N-1個元素(a[1]到a[N])中找到最小值位置min,如果min不等于1,將a[min]與a[1]交換,……,直至第N-1次從最后兩個數(shù)(a[N-2]到a[N-1])中找到最小值位置min,如果min不等于N-2,將a[min]與a[N-2]交換9.1一維數(shù)組9.1一維數(shù)組假設(shè)數(shù)組a有10個數(shù)據(jù),依次為3、2、7、1、4、8、5、12、45、9,則排序過程為:第一趟排序(i=0)的過程中,找到的a[0]到a[9]10個元素中的最小元素下標放在min中:327148512459
min=3127348512459min!=0,交換a[0]與a[3]第二趟排序(i=1)過程中,找到的a[1]到a[9]9個元素中的最小元素下標放在min中:127348512459min==1,元素已在合適的位置,不需交換。第三趟排序(i=2)過程中,找到的a[2]到a[9]8個元素中的最小元素下標放在min中:127348512459min=3123748512459min!=2,交換a[2]與a[3]依此類推,在經(jīng)過九趟排序后得到有序序列:1234578912459.1一維數(shù)組#defineN10#include"stdio.h"main(){inta[N],i,j,min,temp;printf("pleaseenter%dnumbers:",N);for(i=0;i<N;i++) /*輸入數(shù)列*/scanf("%d",&a[i]);for(i=0;i<N-1;i++)/*N-1趟排序*/{min=i;for(j=i+1;j<N;j++)/*查找最小值,讓min指向它*/
if(a[j]<a[min])min=j;if(min!=i)/*若最小值未在第i個位置,交換a[i]、a[min]*/{temp=a[i];a[i]=a[min];a[min]=temp;}}
9.1一維數(shù)組printf("thesortedarrayis:\n");/*輸出排序后的數(shù)列*/
for(i=0;i<N;i++)printf("%6d",a[i]);}【例9.4】在遞減的有序數(shù)列中,插入一個數(shù)x,使得數(shù)列仍然有序(如果有相同的數(shù)則不插入)。和前面的例題一樣,用數(shù)組存放數(shù)列。則本題相當于在一個有序的數(shù)組中尋找合適的位置插入一個元素。問題的解決可分為兩個步驟:①尋找插入位置:由于是非遞增序列,所以插入位置應(yīng)該是在第一個小于x的數(shù)組元素的前面(假定找到的位置為k);②如果第k個元素等于x,則不須插入,否則執(zhí)行插入操作:a. 第k個元素及其后面的元素都后移一位。b. 插入元素在k位置。9.1一維數(shù)組#defineN11#include"stdio.h"main(){intarr[N],x,j,k;printf("\npleaseenterthearray(%d):",N-1);for(j=0;j<N-1;j++)scanf("%d",&arr[j]);/*輸入數(shù)組元素*/
printf("pleaseenterthenumber:");scanf("%d",&x);/*輸入待插入元素*/
for(j=0;x<arr[j]&&j<N-1;j++);/*尋找插入位置*/
k=j;/*k記錄插入位置*/
9.1一維數(shù)組
if(arr[k]==x&&k<N-1)/*數(shù)已經(jīng)存在,不執(zhí)行插入操作,原樣輸出數(shù)組*/
for(j=0;j<N-1;j++)printf("%4d",arr[j]);else{for(j=N-2;j>=k;j--)arr[j+1]=arr[j];/*移動插入位置以后的元素*/
arr[k]=x;
/*插入元素*/
printf("thearrayis:\n");for(j=0;j<N;j++)printf("%4d",arr[j]);/*輸出數(shù)組*/}}某次程序運行結(jié)果為:pleaseenterthearray(10):6743393330282615107↙pleaseenterthenumber:27↙thearrayis:6743393330282726151079.1一維數(shù)組一維數(shù)組和指針數(shù)組元素的地址數(shù)組元素的地址也可用元素前面加地址操作符的方式來獲得:
&數(shù)組名[下標]數(shù)組名C語言規(guī)定數(shù)組名代表數(shù)組的首地址,是一個地址常量。一維數(shù)組的數(shù)組名是基類型為數(shù)組元素類型的指針類型??梢酝ㄟ^數(shù)組名來表示數(shù)組元素的地址,還可以指針方式引用數(shù)組元素。設(shè)a為一維數(shù)組的數(shù)組名,則:a+i表示數(shù)組第i個元素的地址(和&a[i])等價),a+0和a是等價的。*(a+i)表示數(shù)組的第i個元素。9.1一維數(shù)組【例9.5】輸入一個有10個數(shù)的數(shù)列,然后輸出。注意數(shù)組的引用形式。#include"stdio.h"main(){inta[10],i;printf("pleaseenterthe10number:");
for(i=0;i<10;i++)/*輸入數(shù)組元素*/
scanf("%d",a+i);
for(i=0;i<10;i++)/*輸出數(shù)組元素*/
printf("%3d",*(a+i));}程序運行結(jié)果:pleaseenterthe10number:9876543210↙98765432109.1一維數(shù)組指向數(shù)組元素的指針變量一維數(shù)組定義之后,可以定義指針變量指向該數(shù)組的元素。通過指針變量可以對數(shù)組元素進行操作。語句“inta[10],*p=a;”之后,數(shù)組元素a[i]可以有四種方式表示:①a[i]②p[i]③*(a+i)④*(p+i)而數(shù)組元素a[i]的地址也相應(yīng)有四種方式表示:①&a[i]②&p[i]③a+i④p+i指針變量的值是可以變化的,所以既可引用指針變量的值,也可重新給它賦值。例如,若p的值是&a[1],那么下面的操作均合法:p++、++p:表示指針變量p向后移動一個數(shù)組元素的存儲單元,相當于p=&a[2];p--、--p表示指針變量p向前移動一個數(shù)組元素的存儲單元,相當于p=&a[0]。9.1一維數(shù)組p+x、p-x(x表示某個整型的變量、常量或表達式)分別表示以指針變量p為基準向后、向前移動x個數(shù)組元素的存儲單元,例如p+2表示&a[3],p-1表示&a[0]。p-q(p、q是指向同一個數(shù)組的數(shù)組元素的指針變量,否則無意義)表示這兩個指針變量所指向數(shù)組元素的下標之差,例如q=&a[0];則p-q的值為1。指向同一個數(shù)組的數(shù)組元素的指針變量以及該數(shù)組的數(shù)組名之間可以進行比較,比較的是地址值大小。因此,p<a的值為真,p>a的值為真,p==a的值為假,p!=a的值為真。可利用指針間的關(guān)系做數(shù)組操作的循環(huán)條件。9.1一維數(shù)組【例9.6】輸入一個有10個數(shù)的數(shù)列,然后輸出。#include"stdio.h"main(){inta[10],*p,*q;
printf("pleaseenterthe10number:");
for(p=a;p<a+10;p++)/*輸入數(shù)組元素scanf("%d",p);*/
for(p=&a[0],q=a+10;p<q;p++)/*輸出數(shù)組元素*/printf("%3d",*p);}
*(p++)表示先取p所指向的數(shù)組元素的值作為表達式的值,再將指針變量p向后移動一個數(shù)組元素的存儲單元;*(--p)表示先將指針變量p向前移動一個數(shù)組元素的存儲單元,再取p所指向的數(shù)組元素的值作為表達式的值。9.1一維數(shù)組【例9.7】輸入一個有10個數(shù)的數(shù)列,然后按正序、逆序分別輸出。#include"stdio.h"main(){inta[10],*p,*q;printf("\npleaseenterthe10number:");for(p=a;p<a+10;)/*輸入數(shù)組元素*/
scanf("%d",p++);for(p=&a[0],q=a+10;p<q;)/*正序輸出數(shù)組元素*/
printf("%3d",*(p++));
printf("\n");for(p=a+9;p>=a;)/*逆序輸出數(shù)組元素*/
printf("%3d",*(p--));}pleaseenterthe10number:0123456789↙012345678998765432109.2二維數(shù)組二維數(shù)組的定義二維數(shù)組定義的具體格式為:存儲類型數(shù)據(jù)類型數(shù)組名[長度1][長度2];例如,語句“staticintb[4][3];”
二維數(shù)組定義中,數(shù)組名、數(shù)據(jù)類型、存儲類型的定義方式以及數(shù)組長度類型的選取和一維數(shù)組相同,不同的只是數(shù)組名后面緊跟兩個方括號,定義了兩個長度。二維數(shù)組定義中的第一個長度說明數(shù)組的數(shù)據(jù)行數(shù),第二個長度說明每行的數(shù)據(jù)個數(shù)。數(shù)組的元素個數(shù)就是兩個長度之積。二維數(shù)組只是在邏輯上是二維的,從存儲上看,二維數(shù)組仍是一維線性空間。C語言中,按照行優(yōu)先方式存儲二維數(shù)組,即先存放第0行的元素,再存放第1行的元素……;同一行中再按列順序存上面定義的b在內(nèi)存中的存儲示意圖如圖9.2二維數(shù)組二維數(shù)組的引用只能引用二維數(shù)組的單個數(shù)組元素,不能引用整個數(shù)組。二維數(shù)組元素的引用形式為:數(shù)組名[下標1][下標2]二維數(shù)組的下標可以是整型的變量、常量或表達式。第一維下標的取值范圍是[0,第一維長度-1],第二維下標的取值范圍是[0,第二維長度-1]。9.2二維數(shù)組二維數(shù)組的初始化定義之后進行數(shù)組的初始化操作,則只能對每個數(shù)組元素一一賦值,intarr[4][10],i,j;for(i=0;i<4;i++)for(j=0;j<10;j++)
arr[i][j]=0;如果在定義數(shù)組時完成數(shù)組的初始化操作,賦值格式有兩種。將數(shù)組元素的初值依次放在一對花括弧中并用賦值號與數(shù)組連接。具體格式為:存儲類型數(shù)據(jù)類型數(shù)組名[數(shù)組長度]={初值列表};二維數(shù)組花括弧內(nèi)各個初值之間用逗號分隔,初值類型必須與數(shù)組類型一致。系統(tǒng)自動按數(shù)組元素在內(nèi)存的順序?qū)⒊踔狄来钨x給相應(yīng)的元素。若數(shù)值型數(shù)組的初值數(shù)量不足時,將0賦給其余數(shù)組元素。例如,語句“intx[2][3]={1,2,3,4,5};”之后,x[0][0]=1,x[0][1]=2,x[0][2]=3,x[1][0]=4,x[1][1]=5。其余元素被自動賦值為0:x[1][2]=0。②賦初值時,每一行的初值放在一個花括號中,所有行的初值再放在一個花括號中。系統(tǒng)將第一個花括號內(nèi)數(shù)據(jù)依次賦值給數(shù)組的第0行,將第二個花括號內(nèi)數(shù)據(jù)依次賦值給數(shù)組的第1行,依次類推。具體格式為:存儲類型數(shù)據(jù)類型數(shù)組名[數(shù)組長度]={{第0行初值列表},{第1行初值列表},…};9.2二維數(shù)組
語句“intx[4][4]={{1,2,3,4},{4,5,6},{},{7}};”之后,系統(tǒng)將1、2、3、4依次賦給x[0][0]、x[0][1]、x[0][2]和x[0][3];4、5、6依次賦給x[1][0]、x[1][1]和x[1][2],沒有列出x[0][3]的初值,系統(tǒng)自動賦0;對應(yīng)第2行的“{}”,系統(tǒng)給x[2][0]、x[2][1]、x[2][2]和x[2][3]均賦值0;第3行對應(yīng){7},則系統(tǒng)將7賦值給x[3][0],x[3][1]、x[3][2]和x[3][3]均被系統(tǒng)賦值為0。注意:在賦初值時需指定第二維數(shù)組長度,可省略第一維的長度。編譯系統(tǒng)會根據(jù)賦初值的情況,自動得到第一維的長度。語句“intx[][3]={{1,2,3},{4}};”,編譯系統(tǒng)可分析出第一維的長度是2。二維數(shù)組二維數(shù)組應(yīng)用舉例【例9.8】編寫程序求一個M行N列的矩陣和一個N行W列的矩陣的乘積。#defineM4#defineN5#defineW4main(){inta[M][N],b[N][W],c[M][W],i,j,k;printf("pleaseenterarraya(%d*%d):\n",M,N);for(i=0;i<M;i++)/*輸入第一個矩陣*/
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
printf("pleaseenterarrayb(%d*%d):\n",N,W);9.2二維數(shù)組for(i=0;i<N;i++)/*輸入第二個矩陣*/
for(j=0;j<W;j++)scanf("%d",&b[i][j]);for(i=0;i<M;i++)/*兩個矩陣相乘,求乘積矩陣中的每一元素*/
for(j=0;j<W;j++){c[i][j]=0;for(k=0;k<N;k++)c[i][j]+=a[i][k]*b[k][j];}
printf("c=a*b:\n");for(i=0;i<M;i++){for(j=0;j<W;j++)printf("%6d",c[i][j]);/*按行輸出乘積矩陣*/
printf("\n");}}9.2二維數(shù)組【例9.9】編程序查找矩陣的鞍點并輸出。矩陣中所謂鞍點就是在其所在行最小,所在列最大的元素。根據(jù)鞍點的定義,每行都可能有一個鞍點,所以要逐行查找。查找第i行鞍點的過程可分為兩個步驟:①找出第i行最小值的列位置k;②判斷第i行第k列元素在第k列是否最大。如果最大則是鞍點;如果不是,則第i行中無鞍點。這里判斷是否為最大值的方式是看是否有比a[i][k]大的值。#defineM9#defineN7main(){inta[M][N];inti,j,k,m,flag=0;printf("\npleaseenterarray:\n");for(i=0;i<M;i++)/*輸入數(shù)組元素*/
for(j=0;j<N;j++)scanf("%d",&a[i][j]);9.2二維數(shù)組for(i=0;i<M;i++){k=0;for(j=1;j<N;j++)/*找第i行的最小元素,k為其列標*/
if(a[i][j]<a[i][k])k=j;for(m=0;m<M;m++)/*判斷第k列是否有元素比a[i][k]大*/
if(a[m][k]>a[i][k])break;if(m>=M)/*若第k列無元素比a[i][k]大,該元素是鞍點,flag為1表示找到過鞍點*/{flag=1;printf("a[%d][%d]=%d",i,k,a[i][k]);}}if(flag==0)printf("\nnone.");/*整個矩陣不存在鞍點,輸出none*/}9.2二維數(shù)組二維數(shù)組和指針數(shù)組元素的地址二維數(shù)組數(shù)組元素的地址可用數(shù)組元素前面加地址操作符的方式來表示:
&數(shù)組名[下標1][下標2]數(shù)組名二維數(shù)組的數(shù)組名是二維數(shù)組的首地址,是地址常量。二維數(shù)組名的基類型不是數(shù)組元素的類型,而是一維數(shù)組類型,是一個行指針類型。二維數(shù)組a的第i行的地址可表示為:①a+i②&a[i]二維數(shù)組第i行、第j列的元素地址可表示為:①&a[i][j]②a[i]+j③*(a+i)+j④&a[0][0]+i*4+j⑤a[0]+i*4+j二維數(shù)組第i行、第j列的元素可表示為:①a[i][j]②*(a[i]+j)③*(*(a+i)+j)④(*(a+i))[j]⑤*(&a[0][0]+i*4+j)二維數(shù)組指向數(shù)組元素的指針
定義指向二維數(shù)組的指針變量后,就可以通過指向元素的指針來引用二維數(shù)組的元素。【例9.10】注意程序中數(shù)組元素的引用形式。main(){inta[3][4],*p,*q,i,j;printf("enterarrayis(3x4):\n");for(i=0;i<3;i++)/*輸入數(shù)組元素*/
for(j=0;j<4;j++)scanf("%d",*(a+i)+j);printf("thearrayis:\n");for(i=0;i<3;i++)/*輸出數(shù)組元素*/{for(j=0;j<4;j++)printf("%3d",*(*(a+i)+j));printf("\n");}9.2二維數(shù)組printf("thearrayis:");for(p=&a[0][0],q=&a[2][3];p<=q;p++)/*輸出數(shù)組元素*/{if((p-&a[0][0])%4==0)printf("\n");
printf("%3d",*p);}
printf("\nthefirstrankis:\n");/*輸出每行第0個數(shù)組元素*/for(i=0;i<3;i++)printf("%d\n",*(*(a+i)));}程序的運行結(jié)果為:enterarrayis(3x4):1234↙5678↙9865↙9.2二維數(shù)組thearrayis:123456789865thearrayis:123456789865thefirstrankis:1599.2二維數(shù)組指向二維數(shù)組的行指針所謂行指針變量就是用來存放“行”地址的變量,即行指針變量是指向一維數(shù)組(一維數(shù)組被看作是一個整體)的指針變量,定義形式如下:類型名(*指針變量名)[數(shù)組長度];這類指針變量的基類型是一維數(shù)組,定義中的類型名是一維數(shù)組的類型,數(shù)組長度是一維數(shù)組的長度。如果行指針p指向二維數(shù)組a的第0行,則二維數(shù)組a的第i行的地址還可表示為:①p+i②&p[i]第i行、第j列的元素的地址還可表示為:①&p[i][j]②p[i]+j③*(p+i)+j④&p[0][0]+i*4+j⑤p[0]+i*4+j二維數(shù)組元素還可表示為:①p[i][j]②*(p[i]+j)③*(*(p+i)+j)④(*(p+i))[j]⑤*(&p[0][0]+i*4+j)二維數(shù)組【例9.11】注意程序中數(shù)組元素的引用形式。main(){inta[3][4],(*p)[4],*q,i,j;
printf("enterarrayis(3x4):\n");for(p=a,i=0;i<3;i++)/*輸入數(shù)組元素*/
for(j=0;j<4;j++)scanf("%d",*(p+i)+j);printf("thearrayis:\n");for(p=a,i=0;i<3;i++){for(j=0;j<4;j++)printf("%3d",*(*(p+i)+j));
printf("\n");}9.2二維數(shù)組printf("thearrayis:\n");for(p=a;p<a+3;p++)/*輸出數(shù)組元素*/{for(j=0;j<4;j++)printf("%3d",*(*p+j));printf("\n");}printf("thearrayis:");for(q=*a;q<=&a[2][3];q++)/*輸出數(shù)組元素*/{if((q-&a[0][0])%4==0)printf("\n");
printf("%3d",*q);}printf("\nthefirstrankis:\n");/*輸出每行第0個數(shù)組元素*/for(p=a;p<a+3;p++)printf("%d\n",**p);}9.2二維數(shù)組程序的運行結(jié)果為:enterarrayis(3x4):1234↙5678↙9865↙thearrayis:123456789865thearrayis:123456789865二維數(shù)組thearrayis:123456789865thefirstrankis:1599.3數(shù)組和函數(shù)數(shù)組元素作函數(shù)實參
數(shù)組元素作為實參的使用方法和同類型的普通變量一樣。若將數(shù)組元素的地址作為實參,則可以在被調(diào)用函數(shù)中通過指針修改數(shù)組元素的值。【例9.12】請分析下列程序的輸出結(jié)果。#include"math.h"#include"stdio.h"voidabs1(inta){a=abs(a);}voidabs2(int*a){*a=abs(*a);}9.3數(shù)組和函數(shù)
main(){intx[4]={-1,2,-3,4},k;for(k=0;k<4;k++)abs1(x[k]);for(k=0;k<4;k++)
printf("%5d",x[k]);printf("\n");for(k=0;k<4;k++)abs2(&x[k]);for(k=0;k<4;k++)
printf("%5d",x[k]);}程序的執(zhí)行結(jié)果為:-12-341234
9.3數(shù)組和函數(shù)數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)的參數(shù)時,要求形參和實參必須均為數(shù)組名或與同類型的指針(地址)。數(shù)組名做函數(shù)的實際參數(shù)時,并不是將所有數(shù)組元素的值傳遞給形參數(shù)組,而是傳遞數(shù)組的起始地址給形參。系統(tǒng)只需為形參開辟一個地址的存儲空間,用來存放實參傳遞過來的數(shù)組起始地址。因而形參數(shù)組使用的是實參數(shù)組的存儲空間,形參數(shù)組的變化會影響實參數(shù)組。【例9.13】數(shù)組逆置:將數(shù)組的第一個元素放到最后一個位置,將第二個元素放到倒數(shù)第二個位置……直至最后一個元素放到第一個位置(函數(shù)形參和實參都用數(shù)組名)。
9.3數(shù)組和函數(shù)#include"stdio.h"voidinvert(x,n)/*數(shù)組置逆函數(shù)*/intx[],n;{inti,j,t;for(i=0,j=n/2;i<=j;i++)/*將相應(yīng)位置上的元素交換*/
{t=x[i];x[i]=x[n-i-1];x[n-i-1]=t;}}main(){inta[10],i;printf("pleaseenterthearray:");for(i=0;i<10;i++)/*輸入數(shù)組元素*/
scanf("%d",&a[i]);invert(a,10);/*調(diào)用置逆函數(shù)*/9.3數(shù)組和函數(shù)
printf("nowthearrayis:");for(i=0;i<10;i++)/*輸出數(shù)組元素*/
printf("%3d",a[i]);}如果輸入1、2、3、4、5、6、7、8、9、10,程序運行結(jié)果為:pleaseenterthearray:12345678910↙nowthearrayis:10987654321【例9.14】數(shù)組逆置(函數(shù)形參用數(shù)組名,實參用指針)。#include"stdio.h"voidinvert(intx[],intn)/*數(shù)組置逆函數(shù)*/{inti,j,t;for(i=0,j=n/2;i<=j;i++)/*將相應(yīng)位置上的元素交換*/{t=x[i];x[i]=x[n-i-1];x[n-i-1]=t;}}9.3數(shù)組和函數(shù)main(){inta[10],i,*p=a;printf("pleaseenterthearray:");for(i=0;i<10;i++)scanf("%d",&a[i]);/*輸入數(shù)組元素*/
invert(p,10);
/*調(diào)用置逆函數(shù)*/
printf("nowthearrayis:");for(i=0;i<10;i++)/*輸出數(shù)組元素*/
printf("%3d",a[i]);}9.3數(shù)組和函數(shù)【例9.15】數(shù)組逆置(函數(shù)形參用指針,實參用數(shù)組名)。voidinvert(int*x,intn)/*數(shù)組置逆函數(shù)*/{int*i,*j,t;for(i=x,j=x+n-1;i<j;i++,j--)/*將相應(yīng)位置上的元素交換*/{t=*i;*i=*j;*j=t;}}main(){inta[10],i;printf("pleaseenterthearray:");for(i=0;i<10;i++)scanf("%d",&a[i]);/*輸入數(shù)組元素*/
invert(a,10);
/*調(diào)用置逆函數(shù)*/
printf("nowthearrayis:");for(i=0;i<10;i++)/*輸出數(shù)組元素*/
printf("%3d",a[i]);}9.3數(shù)組和函數(shù)【例9.16】數(shù)組逆置(函數(shù)形參和實參都用指針)。voidinvert(int*x,intn)/*數(shù)組置逆函數(shù)*/{int*i,*j,t;for(i=x,j=x+n-1;i<=j;i++,j--)/*將相應(yīng)位置上的元素交換*/
{t=*i;*i=*j;*j=t;}}main(){inta[10],i,*p=a;
printf("pleaseenterthearray:");for(i=0;i<10;i++)/*輸入數(shù)組元素*/
scanf("%d",&a[i]);invert(p,10);/*調(diào)用置逆函數(shù)*/
printf("nowthearrayis:");for(i=0;i<10;i++)/*輸出數(shù)組元素*/
printf("%3d",a[i]);}9.4字符數(shù)組字符數(shù)組的定義和引用一維字符數(shù)組的定義格式為:存儲類型char數(shù)組名[數(shù)組長度];例如,語句“staticcharstr1[8];”二維字符數(shù)組的定義格式為:存儲類型
char數(shù)組名[長度1][長度2];例如,語句“charstr2[6][80];”字符數(shù)組元素也可通過數(shù)組名和下標引用。字符數(shù)組也可以在定義時初始化,方法和其他類型的數(shù)組一樣。若沒有對字符數(shù)組全部元素賦值,編譯系統(tǒng)會對剩余的元素自動賦值為空字符??兆址?\0'來表示,是ASCII碼值為0的字符,表示什么都不做,也不顯示。在定義字符數(shù)組之后,只能逐個給數(shù)組元素賦值。9.4字符數(shù)組【例9.17】將一行字符中所有字母替換為在字母表中其后的第三個字母,即a替換為d、b替換為f、c替換為g……,x、y、z分別替換為a、b、c,然后輸出。#include"stdio.h"#include"string.h"main(){charstr[80],i;printf("pleaseenterthecharacters:");i=0;while((str[i]=getchar())!='\n')i++;/*輸入字符序列,當輸入字符為回車時結(jié)束*/for(i=0;str[i]!='\n';i++){if(str[i]<='w'&&str[i]>='a')str[i]=str[i]+3;if(str[i]<='z'&&str[i]>='x')str[i]=str[i]-23;if(str[i]<='W'&&str[i]>='A')str[i]=str[i]+3;
9.4字符數(shù)組
if(str[i]<='Z'&&str[i]>='X')str[i]=str[i]-23;}for(i=0;str[i]!='\n';i++)/*輸出字符序列*/
printf("%c",str[i]);}如果輸入“AF5ab#$djaxf!”,程序的運行結(jié)果為:pleaseenterthecharacters:AF5ab#$djaxf!↙DI5de#$gmdai!9.4字符數(shù)組字符串和字符數(shù)組字符串的表示C語言中不保存字符串的長度,在字符串末尾加字符串結(jié)束標志空字符‘\0’以表示字符串結(jié)束。對于字符串常量,編譯系統(tǒng)處理時會自動在字符串末尾處加上‘\0’。因此,含有n個字符的字符串常量在內(nèi)存中占n+1個字節(jié)的空間,第n+1個字節(jié)存放‘\0’。字符串常量和字符常量是不同,主要區(qū)別有兩點:形式不同,字符串常量是用雙引號引起來的字符序列,字符序列可以為空,也可以是一個或多個字符;而字符常量是用單引號引起來的單個字符;存儲不同,字符串常量要占用(字符串長度+1)個字節(jié);而字符常量占用一個字節(jié)空間存放其本身。9.4字符數(shù)組
例如,‘s’
在內(nèi)存保存的是字母s的ASCII碼值,占一個字節(jié);而“s”
在內(nèi)存保存的是字母s和空字符‘\0’的ASCII碼值,占兩個字節(jié)。“”表示空串,在內(nèi)存中保存的是空字符‘\0’的ASCII碼值,占一個字節(jié)?!啊北硎疽粋€含有一個空格的字符串,在內(nèi)存中占兩個字節(jié);‘’表示空格字符,在內(nèi)存中占一個字節(jié)。注意:對于字符串數(shù)組,系統(tǒng)不自動添加結(jié)束標志‘\0’9.4字符數(shù)組【例9.18】從鍵盤輸入一行字符,存放在字符數(shù)組中,然后輸出。#defineN80#include"stdio.h"main(){charstr[N];inti,j;printf("pleaseenterthecharacters:");for(i=0;(str[i]=getchar())!='\n';i++);/*輸入字符序列,當輸入回車時結(jié)束*/
str[i]='\0';/*添加字符串結(jié)束標志*/
for(i=0;str[i]!='\0';i++)printf("%c",str[i]);/*輸出字符序列*/}9.4字符數(shù)組字符串常量賦給字符數(shù)組若在定義字符數(shù)組的同時賦初值,則可將字符串常量賦給它。例如,charc[20]={"Thegreatwall"};習慣上可以省略花括號,上面定義可寫為:charc[20]="Thegreatwall";若定義字符數(shù)組時完成賦初值,則可以在定義中省略數(shù)組的長度。系統(tǒng)會根據(jù)所賦字符串常量的實際長度來確定字符數(shù)組的長度。例如,上述定義也可寫為:charc[]="Thegreatwall";字符串常量末尾處有系統(tǒng)自動加的結(jié)束標志‘\0’,所以要求數(shù)組長度比字符串長度至少大1。例如,charc[14]="Thegreatwall";數(shù)組c不能滿足字符串長度。除了數(shù)組定義時可以將字符串直接付給字符數(shù)組外,其它時刻只能對元素進行賦值。9.4字符數(shù)組【例9.19】寫出程序結(jié)果,并考慮原因。#include"stdio.h"main(){charstr1[]="Thisisastring";charstr2[]={'T','h','i','s','','i','s','','a','','s','t','r','i','n','g','\0'};
charstr3[]={'T','h','i','s','','i','s','','a','','s','t','r','i','n','g'};
inti;
for(i=0;str1[i]!='\0'&&i<20;i++)
printf("%c",str1[i]);
printf("\nlength:%3d\n",i);for(i=0;str2[i]!='\0'&&i<20;i++)
printf("%c",str2[i]);
printf("\nlength:%3d\n",i);
9.4字符數(shù)組for(i=0;str3[i]!='\0'&&i<20;i++)
printf("%c",str3[i]);printf("\nlength:%3d\n",i);}程序運行結(jié)果為:Thisisastringlength:16Thisisastringlength:16ThisisastringΦ??length:209.4字符數(shù)組常用字符串處理函數(shù)字符串輸入函數(shù)gets格式:gets(字符數(shù)組)功能:接收從鍵盤輸入的一個字符串(可包含空格),存放在字符數(shù)組中。函數(shù)的返回值是字符數(shù)組的起始地址。字符串輸出函數(shù)puts格式:puts(字符數(shù)組)功能:將存放在字符數(shù)組中的字符串輸出到顯示器上。該函數(shù)沒有返回值。字符串比較函數(shù)strcmp格式:strcmp(字符串1,字符串2)功能:比較兩個字符串的大小。字符串1、2可以是字符串常量或已賦值的字符數(shù)組。若字符串1大于字符串2,返回一個正整數(shù);若字符串1等于字符串2,返回整數(shù)0;若字符串1小于字符串2,返回一個負整數(shù)。9.4字符數(shù)組字符串復制函數(shù)
strcpy格式:strcpy(字符數(shù)組1,字符串2)功能:將字符串2的內(nèi)容原樣復制到字符數(shù)組1。函數(shù)的返回值是字符數(shù)組1的起始地址。字符數(shù)組1是已定義的足夠長的字符數(shù)組;字符串2可以是字符串常量或者已賦值的字符數(shù)組。字符串連接函數(shù)strcat格式:strcat(字符數(shù)組1,字符串2)功能:將字符串2連接到字符數(shù)組1中的字符串之后,并且將連接后的新串存放于字符數(shù)組1中。函數(shù)的返回值是字符數(shù)組1的起始地址。測試字符串長度函數(shù)strlen格式:strlen(字符串)功能:求字符串的長度,返回值是字符串長度。函數(shù)的參數(shù)可以是字符串常量或者是已賦值的字符數(shù)組。字符串的長度指的是字符串實際長度,而不包含'\0'在內(nèi)。9.4字符數(shù)組注意:六個字符函數(shù)都要求字符數(shù)組中存放的字符串有結(jié)束標志'\0'?!纠?.20】比較兩個字符串的大小。#include"stdio.h"#include"string.h"main(){charstr1[20],str2[20],str[20];intflag;printf("\npleaseenterthefirststring:");gets(str1);/*輸入字符串1*/
printf("pleaseenterthesecondstring:");gets(str2);
/*輸入字符串2*/flag=strcmp(str1,str2);/*比較字符串的大小*/9.4字符數(shù)組if(flag<0)strcpy(str,str2);
/*復制字符串*/
elsestrcpy(str,str1);/*復制字符串*/printf("thestringis:");puts(str);
/*輸出字符串*/}如果輸入字符串"bcdefgj"和"abcdef",程序運行結(jié)果為:pleaseenterthefirststring:bcdefgj↙pleaseenterthesecondstring:abcdef↙thestringis:bcdefgj9.4字符數(shù)組字符數(shù)組和函數(shù)字符數(shù)組和其他數(shù)組一樣可以作為函數(shù)的形式參數(shù)或?qū)嶋H參數(shù)?!纠?.21】輸入一個字符串,再分別以大寫字母和小寫字母形式輸出該字符串。#include"stdio.h"#defineN80voidlowercase(charstr[])/*以大寫形式輸出字符串*/{intk;for(k=0;str[k]!='\0';k++)
if(str[k]>='a'&&str[k]<='z')putchar(str[k]-32);elseputchar(str[k]);printf("\n");}9.4字符數(shù)組voidcapital(charstr[])/*以小寫形式輸出字符串*/{intk;for(k=0;str[k]!='\0';k++)if(str[k]>='A'&&str[k]<='Z')putchar(str[k]+32);elseputchar(str[k]);
printf("\n");}main(){charc[N];intk;printf("pleaseenterthestring:");gets(c);/*輸入字符串*/
lowercase(c);capital(c);}9.4字符數(shù)組輸入“ds78TYTY(kdfdslQW8”時,程序運行結(jié)果為:pleaseenterthestring:ds78TYTY(kdfdslQW8↙DS78TYTY(KDFDSLQW8ds78tyty(kdfdslqw89.4字符數(shù)組字符指針指向字符數(shù)組的指針變量指向字符數(shù)組的指針變量也就是指向字符類型變量的指針?!纠?.22】比較兩個字符串大小(不使用庫函數(shù))。#include"stdio.h"intcompare(char*a,char*b)/*比較字符串a(chǎn)、b的大小,a比b大返回1,a等于b返回0,a小于b返回-1*/{for(;(*a==*b)&&(*a!='\0')&&(*b!='\0');a++,b++);if(*a>*b)return(1);elseif(*a==*b)return(0);elsereturn(-1);}9.4字符數(shù)組main(){chara[20],b[20];
intflag;printf("pleaseenterthefirststring:");gets(a);/*輸入第一個字符串*/
printf("pleaseenterthesecondstring:");gets(b);/*輸入第二個字符串*/
flag=compare(a,b);
printf("thefirststring");/*輸出比較的結(jié)果*/if(flag==0)printf("=");elseif(flag<0)printf("<");elseprintf(">");
printf("thesecondstring\n");}9.4字符數(shù)組如果輸入字符串"bc"和"afy57bcdef",程序運行結(jié)果為:pleaseenterthefirststring:bc↙pleaseenterthesecondstring:afy57bcdef↙thefirststring>thesecondstring9.4字符數(shù)組指向字符串常量的指針變量定義指針變量時直接賦值,格式為:存儲類型char*指針變量=字符串常量;例如,語句“char*s1="thisisastring!";”定義指針變量之后再賦值,格式為:
指針變量=字符串常量;例如,在語句“char*s1;”之后,可用以下語句使s1指向字符串"thisisastring!":s1="thisisastring!";字符串常量存放在內(nèi)存的某段連續(xù)存儲單元中。這兩種賦值都不是將字符串賦給指針變量,而只是將字符串常量在內(nèi)存的首地址賦給字符指針變量。字符數(shù)組存放字符串的方式與字符串指針方式是不同的。字符型指針只是一個基類型為字符型的指針變量,用來指向一段無名的地址空間。字符數(shù)組占用固定的存儲空間,每個元素有確定的地址,在這些空間內(nèi)可以存放不超過數(shù)組長度的字符串。9.4字符數(shù)組【例9.23】將兩個字符串連結(jié)成一個新的字符串。voidconnect(char*p,char*pa,char*pb)/*將字符串pa、pb連接成一個字符串p*/{for(;*pa!='\0';p++,pa++)*p=*pa;for(;*pb!='\0';p++,pb++)*p=*pb;*p='\0';}main(){char*pa="thefirststring“,*pb="thesecondstring";
charstr[80];connect(str,pa,pb);printf("thepurposestringis:%s",str);}程序的運行結(jié)果為:thepurposestringis:thefirststringthesecondstring9.5指針數(shù)組指針數(shù)組如果數(shù)組元素的類型是指針類型,則稱該數(shù)組為指針數(shù)組。指針數(shù)組的定義形式為:類型名*數(shù)組名[數(shù)組長度];例如,語句“float*p[6];”定義了一個指針數(shù)組p,數(shù)組元素為基類型為實型的指針。指針數(shù)組一般都與其他數(shù)組或字符串相聯(lián)系。指針數(shù)組的元素一般指向其他數(shù)組的數(shù)組元素、二維數(shù)組的行或字符串?!纠?.24】按照數(shù)組元素的大小對數(shù)組元素地址進行排序(采用冒泡排序法)。若排序的結(jié)果要求是非遞減的,則冒泡排序的思路是:對于n個元素,從前向后依次將相鄰元素進行比較。若前面的元素大于后面的元素,則兩個元素交換。這樣通過n-1次比較,最大的元素移到了最后;然后,再對前n-1個元素做同樣的操作,次大的元素移到了倒數(shù)第二個位置;……排序n-1趟,即得到一個有序的序列。9.5指針數(shù)組例如,數(shù)組a有67、4、87、32、45、1、2、7、17、20十個數(shù),則排序過程為:第一趟冒泡排序?qū)?0個數(shù)進行操作:6748732451271720a[0]和a[1]比較,a[0]大于a[1],a[0]和a[1]互換:4678732451271720
a[1]和a[2]比較,a[1]小于a[2],不進行互換操作:4678732451271720a[2]和a[3]比較,a[2]大于a[3],a[2]和a[3]互換:4673287451271720
a[3]和a[4]比較,a[3]大于a[4],a[3]和a[4]互換:4673245871271720
a[4]和a[5]比較,a[4]大于a[5],a[4]和a[5]互換:4673245187271720a[5]和a[6]比較,a[5]大于a[6],a[5]和a[6]互換:9.5指針數(shù)組4673245128771720a[6]和a[7]比較,a[6]大于a[7],a[6]和a[7]互換:4673245127871720a[7]和a[8]比較,a[7]大于a[8],a[7]和a[8]互換:4673245127178720a[8]和a[9]比較,a[8]大于a[9],a[8]和a[9],最后:673245127172087第二趟冒泡排序?qū)η?個數(shù)進行操作,方法和第一趟排序相同,結(jié)果為:43245127172067第三趟冒泡排序?qū)η?個數(shù)處理的結(jié)果為:432127172045依次類推,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度房屋抵押權(quán)設(shè)立合同
- 教育信息化解決方案項目投資合同
- 物流配送損害免責聲明
- 教育培訓服務(wù)責任豁免協(xié)議
- 文化產(chǎn)業(yè)投資開發(fā)協(xié)議書
- 攝影工作室拍攝作品著作權(quán)歸屬聲明
- 農(nóng)業(yè)現(xiàn)代化高效節(jié)水灌溉技術(shù)推廣方案
- 企業(yè)產(chǎn)品質(zhì)量危機處理預案
- 高考文言文雙文本專練:《史記》《論語》
- 近期項目成果回顧與反思
- 2025年不停電電源(UPS)項目合作計劃書
- 林木采伐安全協(xié)議書范本
- 招聘技巧話術(shù)培訓
- 2025年湖南食品藥品職業(yè)學院高職單招職業(yè)適應(yīng)性測試近5年??及鎱⒖碱}庫含答案解析
- 碳酸鈣脫硫劑項目可行性研究報告立項申請報告模板
- 山東省泰安市新泰市2024-2025學年(五四學制)九年級上學期1月期末道德與法治試題(含答案)
- 英語-遼寧省大連市2024-2025學年高三上學期期末雙基測試卷及答案
- DB3502T 160-2024 工業(yè)產(chǎn)品質(zhì)量技術(shù)幫扶和質(zhì)量安全監(jiān)管聯(lián)動工作規(guī)范
- 燃氣農(nóng)村協(xié)管員培訓
- 春節(jié)后復工安全教育培訓
- 提高發(fā)票額度的合同6篇
評論
0/150
提交評論