




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
C語言程序設計第9章數組數組是指一組相同類型數據的有序集合。每個數組包含一組具有同一類型的變量,這些變量在內存中占有連續的存儲單元。在程序中這些變量具有相同的名字,但具有不同的下標。inta[5];數組名數組元素個數類型名9.1一維數組的定義和一維數組元素的引用9.1.1一維數組的定義類型名數組名[整型常量表達式],……;shorta[5];a[0]a[1]a[2]a[3]a[4]低地址高地址2000H2001H2002H2003H2004H2005H2006H2007H2008H2009H1567326989.1.2一維數組元素的引用數組名[下標表達式]如:doublex[8];則x[0]、x[j]、x[i+k]均合法。注意:i+k是下標表達式而不是兩個下標。說明:1、“下標表達式”可以是任何非負整型數據,取值范圍是0~(元素個數-1)。特別強調:在運行C語言程序過程中,系統并不自動檢驗數組元素的下標是否越界。因此在編寫程序時,保證數組下標不越界是十分重要的。2、1個數組元素,實質上就是1個變量,它具有和相同類型單個變量一樣的屬性,可以對它進行賦值和參與各種運算。3、一個數組不能整體引用,數組名是一個地址常量,它代表整個數組的首地址。例如:doublex[8],*p,q;p=x;q=x;不能將數組名賦給一個普通變量9.1.3一維數組的初始化1、在定義語句中給所定義數組賦初值數據類型數組名[常量表達式]={初值表}說明:1、初值放在賦值號后的花括號中,數值類型與說明類型一致,初值間用逗號隔開,系統將自動按順序從第一個元素開始依次給數組中元素賦值。如:inta[8]={0,1,2,3,4,5,6,7};2、“初值表”中的初值個數,可以少于元素個數,即允許只給前面的部分元素賦初值,其后的元素自動賦0。字符補‘\0’。如:inta[10]={0};/*10個元素都賦初值0*/
charc[5]={‘@’};/*后4個元素均賦‘\0’*/3、當初值多于元素個數,編譯時會出錯。4、C語言規定可以通過賦初值來定義數組的大小,這時數組說明符的一對方括號中可以不指定數組的大小。如:inta[]={0,1,2,3,4};以上語句隱含地定義了a數組含有5個元素。5、數組不初始化,其元素值為隨機數。#include<stdio.h>main(){intary[10];inti,high;for(i=0;i<10;i++){scanf("%d",&ary[i]);}high=ary[0];for(i=1;i<10;i++){if(ary[i]>high) high=ary[i];}printf(“%d”,high);}定義賦值比較9.2一維數組和指針9.2.1一維數組和數組元素的地址數組是一組相同類型數據的集合,數組中各個元素在內存占據連續的存儲單元,每個內存單元都有相應的地址。數組所占內存單元的首地址稱為數組的指針,數組元素所占內存單元的首地址稱為數組元素的指針。因此,可以用指針變量來指向數組元素。如shorta[5];a[0]a[1]a[2]a[3]a[4]2000H2001H2002H2003H2004H2005H2006H2007H2008H2009H數組的指針C語言規定,數組名代表數組的首地址,因此,數組名實際上也是指針,但它是一個固定不變的地址常量。如:inta[5];a是數組名,也是指針,它永遠指向數組的首地址,即不能將新地址賦給該指針。但可以通過形如a+k的形式(k是整數)來表達該數組其它元素的地址。如:for(k=0;k<5;k++)scanf(“%d”,a+k);若有語句:inta[10];int*p;p=a;則:for(k=0;k<10;k++)scanf(“%d”,a+k);for(k=0;k<10;k++){scanf(“%d”,p);p++;}for(k=0;k<10;k++)scanf(“%d”,p++);for(;p-a<10;p++)scanf(“%d”,p);
數組和指針的關系9.2.2通過數組的首地址引用數組元素采用間接運算符“*”。如:數組元素a[0]*&a[0]*(a+0)*a數組元素a[1]*&a[1]*(a+1)for(k=0;k<10;k++)printf(“%4d”,a[k]);for(k=0;k<10;k++)printf(“%4d”,*(a+k));9.2.3通過指針引用一維數組元素若有語句:inta[10],*p,k;p=a;for(k=0;k<10;k++)printf(“%4d”,a[k]);for(k=0;k<10;k++)printf(“%4d”,*(p+k));for(k=0;k<10;k++){printf(“%4d”,*p);p++;}for(k=0;k<10;k++)printf(“%4d”,*p++);for(;p-a<10;p++)printf(“%4d”,*p);9.2.4用帶下標的指針變量引用一維數組元素若有語句:ints[10],*p,i;p=s;數組元素s[i]p[i]練習:有如下說明:inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;則數值為9的表達式是_____。*p+9*(p+8)*p+=9p+8√
練習:下面程序執行后的輸出結果是____。#include<stdio.h>inta[]={2,4,6,8};main(){inti;int*p=a;for(i=0;i<4;i++)a[i]=*p;printf(“%d\n”,a[2]);}6B)8C)4D)2√
練習:設有定義語句:intx[6]={2,4,6,8,5,7},*p=x,i;要求依次輸出x數組6個元素中的值,不能完成此操作的語句是_____。for(i=0;i<6;i++)printf(“%2d”,*(p++));for(i=0;i<6;i++)printf(“%2d”,*(p+i));for(i=0;i<6;i++)printf(“%2d”,*p++);for(i=0;i<6;i++)printf(“%2d”,(*p)++);√
練習:下面程序執行后的輸出結果是____。#include<stdio.h>inta[]={2,4,6,8};main(){inti;int*p=a;for(i=0;i<4;i++)a[i]=*p++;printf(“%d\n”,a[2]);}6B)8C)4D)2√
練習:下面程序執行后的輸出結果是____。main(){inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;printf(“%d\n”,*(p+2));}3B)4C)1D)2√
練習:有如下程序段:inta[10]={1,2,3,4,5,6,7,8,9,10};int*p=&a[3],b;b=p[5];則b的值是_____。5B)6C)9D)8√
練習:下面程序執行后的輸出結果是____。main(){inta[5]={2,4,6,8,10},*p,**k;p=a;k=&p;printf(“%d”,*(p++));printf(“%d\n”,**k);}4B)22C)24D)46√
練習:下面程序執行后的輸出結果是____。main(){inta[]={1,2,3,4,5,6,7,8,9,10,11,12};int*p=a+5,*q=NULL;*q=*(p+5);printf(“%d%d\n”,*p,*q);}運行后報錯6661255√
9.3函數之間對一維數組和數組元素的引用9.3.1數組元素作實參數組元素作實參時,對應的形參必須是類型相同的變量,所以用法與普通變量一致,傳遞實參后并不能改變數組元素的值。9.3.2數組名作實參數組名本身就是一個地址值,因此對應的形參應當是一個指針變量,可以通過傳遞改變數組元素的值。例題見書上例9.2。注意:被調用函數定義部分可以有三種寫法:如:arrin(int*a)arrin(inta[])arrin(inta[M])M是一個符號常量9.3.4函數的指針形參和函數體中數組的區別若有以下程序,程序中定義了fun函數,形參a指向主函數中的w數組,函數體內定義了一個b數組,函數把b數組的起始地址作為函數值返回,企圖使主函數中的指針p指向函數體內b數組的開頭。#defineN10int*fun(inta[N],intn){intb[N];
……returnb;}main(){intw[N],*p;
……p=fun(w,N);
……}以上程序涉及幾個概念:1、函數fun中,形參a可以寫成a[N],a[],*a,它是一個指針變量,在調用fun函數時,系統只為形參a開辟一個存儲單元,并把main函數中w數組首地址存進去,使它指向w數組地址。2、函數fun的函數體定義了一個b數組,在調用fun函數時,系統為它開辟了一串連續存儲單元,b是一個地址常量。雖然a和b有相同的說明形式,但它們一個是作為形參的指針,一個是函數體內定義的數組,具有完全不同的含義。3、在fun函數執行完畢,返回主函數時,系統釋放a,b所占存儲單元,指針變量a和數組b將不再存在。因此,函數fun不應把b的值作為函數值返回,這樣做,主函數中的指針變量p將不指向任何對象而成為“無向指針”。練習:若有以下調用語句,則不正確的fun函數的首部是____。main(){inta[50],n;fun(n,&a[9]);..}voidfun(intm,intx[])voidfun(ints,inth[41])voidfun(intp,int*s)voidfun(intn,inta)√
練習:下面程序執行后的輸出結果是____。voidfunc(int*a,intb[]){b[0]=*a+6;}main(){inta,b[5];a=0;b[0]=3;func(&a,b);printf(“%d\n”,b[0]);}6B)7C)8D)9√
練習:下面程序執行后的輸出結果是____。f(intb[],intn){inti,r=1;for(i=0;i<=n;i++)r=r*b[i];returnr;}main(){intx,a[]={2,3,4,5,6,7,8,9};x=f(a,3);printf(“%d\n”,x);}720B)120C)24D)6√
9.5二維數組的定義和二維數組元素的引用9.5.1二維數組的定義類型名數組名[常量表達式1][常量表達式2],……;shorta[2][3];a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]低地址高地址2000H2001H2002H2003H2004H2005H2006H2007H2008H2009H200aH200bH9.5.2二維數組元素的引用數組名[下標表達式1][下標表達式2]規則與一維數組元素的一樣。1、行列下標下限為0,上限為n-12、一定要把兩個下標分別放在兩個方括號內3、第m行n列:a[m-1][n-1]9.5.3二維數組的初始化1、按行對二維數組初始化。如:inta[2][3]={{1,1,1},{4,4,4}};若大括號或其中的數據不夠,后面的元素自動賦0。如:inta[3][4]={{1,2,3,4},{5,6,7,8}};如:inta[3][4]={{1,2},{3,4,5},{6,7,8,9}}2、按數組的存儲順序賦初值。如:intb[2][2]={1,2,3,4};表示將1初始化給b[0][0],2初始化給b[0][1],3初始化給b[1][0],4初始化給b[1][1]。若數據不夠,后面的元素自動賦0。9.5.4通過賦初值定義二維數組的大小如果對數組元素全部賦初值,定義數組時行長度可以省略,列長度不能省略。如:inta[][3]={{1,2,3},{4,5},{6},{8}};若用以下形式:intb[][3]={1,2,3,4};確定第一維的規則:若初值個數能被第二維常量除盡,則商數即為第一維大小。如:intb[][3]={1,2,3,4,5,6};/*第一維為2*/若初值個數不能被第二維除盡,則第一維大小=商數+1。如:intb[][3]={1,2,3,4};/*第一維為2*/練習:定義如下變量和數組:intk;inta[3][3]={9,8,7,6,5,4,3,2,1};則下面語句的輸出結果是_____。for(k=0;k<3;k++)printf(“%d”,a[k][k]);753B)951C)963D)741√
二維數組元素的地址的表示:設有inta[3][4];a[i][j]的地址可有5種表示:1、&a[i][j]2、a[i]+j3、*(a+i)+j4、&a[0][0]+4*i+j5、a[0]+4*i+j9.6.2通過地址引用二維數組元素若有inta[3][4],i,j;則a數組元素可有5種表達方式引用:1、a[i][j]2、*(a[i]+j)3、*(*(a+i)+j)4、*(&a[0][0]+4*i+j)5、(*(a+i))[j]1、&a[i][j]2、a[i]+j3、*(a+i)+j4、&a[0][0]+4*i+j5、a[0]+4*i+j地址通過建立一個指針數組引用二維數組元素
p128
9.6.4通過建立一個行指針引用二維數組元素指向一維數組指針變量的定義形式:類型標識符(*指針變量名)[數組元素個數]“*”表示其后的變量為指針類型,[數組元素個數]表示目標變量是一維數組,并說明一維數組元素的個數。由于“*”比“[]”的運算級別低,“*指針變量名”作為一個說明部分,兩邊必須加括號?!邦愋蜆俗R符”是定義一維數組元素的類型。如:inta[3][4];int
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 特殊疫情用工合同范本
- 院前急救人文護理
- 轉賣養殖棚合同范本
- 園林護理合同范本
- 二零二五全日制早教托班幼兒入園合同
- 二零二五版全新不動產買賣合同書
- 天貓入駐服務協議合同書范例
- 勞動合同中的勞動報酬與薪資發放
- 二零二五版設備維護服務合同模板
- 代人加工混凝土合同范本
- 甘肅省農墾集團有限責任公司招聘生產技術人員筆試真題2024
- 幼兒園總務工作管理
- 2025年上半年山東省濰坊臨朐招聘衛生教育系統部分事業編制及控制總量人員易考易錯模擬試題(共500題)試卷后附參考答案
- 2025年上半年下半年浙江省舟山市港航管理局招聘6人易考易錯模擬試題(共500題)試卷后附參考答案
- 中級維保全部抽考題
- 2025年中醫針灸學主治醫師-中醫針灸學考試題(附答案)
- 老年人安全用藥與護理
- 黑色三分鐘生死一瞬間第9、10部
- 適老化住宅改造服務行業深度調研及發展戰略咨詢報告
- 2025年鄭州黃河護理職業學院單招職業技能測試題庫及答案1套
- 《水利工程白蟻防治技術規程SLT 836-2024》知識培訓
評論
0/150
提交評論