二維數(shù)組傳參傳值_第1頁
二維數(shù)組傳參傳值_第2頁
二維數(shù)組傳參傳值_第3頁
二維數(shù)組傳參傳值_第4頁
二維數(shù)組傳參傳值_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、二維數(shù)組傳參|傳值先給出問題:像下面這樣的數(shù)組,在函數(shù)中如何傳參?也就是說如何保證虛參與實參類型一致。char str_arr310 = (yes,no,uncertain);char *str_array = (yes,no,unsure);函數(shù)原型:void func1( char (*a)10)void func2( char *a )調(diào)用:func1( str_arr );func2( str_array);如果向func2()中傳入str_arr會怎么樣呢?編譯器會警告:傳遞參數(shù)1 (屬于func2時在不兼容的指 針類型間轉(zhuǎn)換。即虛參與實參類型不一致。同理,也不能向func1()中傳

2、入str_array。我們給出完整的測試程序:/*二維數(shù)組傳參測試程序*/#include void func1( char (*a)10)(int i;for(i=0;i3;i+)printf(%s/n,ai);)void func2( char *a )(int i;for(i=0;i3;i+)printf(%s/n,*(a+i);)int main()(char str_arr310 = (yes,no,uncertain);char *str_array = (yes,no,unsure);char *str3 = (a,b,c);/* 這兩種表達效果一樣 */ func1(str_a

3、rr);func2(str_array);return 0;/*end*/運行結(jié)果:rootlocalhost ansi_c# gcc test.crootlocalhost ansi_c# ./a.out yes no uncertain yesnounsurerootlocalhost ansi_c#如果將func1(str_arr);func2(str_array);改成:func1(str_array);func2(str_arr);會怎么呢?rootlocalhost ansi_c# gcc test.ctest.c:在函數(shù) main 中:test.c:22:警告:傳遞參數(shù)1 (屬于

4、funci)時在不兼容的指針類型間轉(zhuǎn)換test.c:23:警告:傳遞參數(shù)1 (屬于func2)時在不兼容的指針類型間轉(zhuǎn)換這兩種數(shù)組的正確賦值應(yīng)該如下:char str_arr310 = (yes,no,uncertain);char *str_array = (yes,no,unsure);char (*pa)10 = str_arr;char *p = str_array;pa和p才是和他們相一致的類型。當(dāng)然,如果不是傳參的話,在main()函數(shù)中就不會發(fā)生這么多煩惱了。/* 非傳參時的情況 */ #include int main()(char str_arr310 = (yes,no,u

5、ncertain);char *str_array = (yes,no,unsure);char *str3 = (a,b,c);int i;for(i=0;i3;i+)printf(%s/n,str_arri);for(i=0;i3;i+)printf(%s/n,str_arrayi);return 0;)/*/運行結(jié)果:rootlocalhost ansi_c# gcc test1.crootlocalhost ansi_c# ./a.outyesnouncertainyesnounsurerootlocalhost ansi_c#這說明了一點,在沒傳參之前,main()函數(shù)清楚它們都是二

6、維數(shù)組。對于上面給出的兩種函數(shù)原型: 函數(shù)原型:void func1( char (*a)10)void func2( char *a )這兩種傳參方法有什么不同呢?這們對實參有什么要求呢?上面只是拋出了一個問題,我在這里的主題是想搞清楚二維數(shù)組傳參有什么奧秘,而非只針對這一個 問題提出解決方法。后面從基礎(chǔ)的開始討論。我們先看看教材上怎么講這一塊的,譚浩強的C程序設(shè)計二維數(shù)組作為參數(shù)傳遞,原文如下(略有改變,請原諒):原文開始可以用二維數(shù)組名作為實參或者形參,在被調(diào)用函數(shù)中對形參數(shù)組定義時可以可以指定所有維數(shù) 的大小,也可以省略第一維的大小說明,如:void Func(int array310

7、);void Func(int array 10);二者都是合法而且等價,但是不能把第二維或者更高維的大小省略,如下面的定義是不合法的:void Func(int array);因為從實參傳遞來的是數(shù)組的起始地址,在內(nèi)存中按數(shù)組排列規(guī)則存放(按行存放),而并不區(qū)分行 和列,如果在形參中不說明列數(shù),則系統(tǒng)無法決定應(yīng)為多少行多少列,不能只指定一維而不指定第二 維,下面寫法是錯誤的:void Func(int array3);實參數(shù)組維數(shù)可以大于形參數(shù)組,例如實參數(shù)組定義為:void Func(int array310);而形參數(shù)組定義為:int array510;這時形參數(shù)組只取實參數(shù)組的一部分,

8、其余部分不起作用。原文結(jié)束也就是說多維數(shù)組傳參要指定第二維或者更高維的大小,可以省略第一維的大小。像int array34,要傳參的話,函數(shù)原型可以為下面三種的任一種:void func(int a34)void func(int a4)void func(int (*a)4)調(diào)用時為:func(array);同時教材里也說了,如果在型參里不說明列數(shù),則編譯器無法決定應(yīng)為多少行多少列。那么能不 能把int array34的數(shù)組名 array 傳給 void func(int *a)呢?看下面:/*/#include int main()(int array34;int *p = array;)

9、*/rootlocalhost ansi_c# gcc test2.ctest2.c:在函數(shù) main中:test2.c:5:警告:從不兼容的指針類型初始化rootlocalhost ansi_c#雖然從本質(zhì)上講int array34的數(shù)組名相當(dāng)于二級指針,但它不等同于一般的二級指針,因為它還 含有數(shù)組相關(guān)的信息,所以在main函數(shù)中:char str_arr310 = (yes,no,uncertain);for(i=0;i=0 & im & 0=j & j n),編譯器是這樣尋址的:p + i*n + j;我們再看一個例子:/* 二維數(shù)組傳參 */ #include void fun( i

10、nt *a, int m, int n) (int i,j;for( i=0; im; +i) (for(j=0;jn;+j)(printf(%d , *( a+i*n+j );)putchar(/n);void func( int *a, int m, int n)(int i,j;for( i=0;im*n;+i)(printf(%d ”,ai);)putchar(/n);)int main()(int a33=(1, 1, 1),(2, 2, 2),(3, 3, 3);fun( (int *)a, 3,3);func( &a00,3,3);func( (int *)a, 3,3);ret

11、urn 0;)*end*/ rootlocalhost ansi_c# gcc test4.crootlocalhost ansi_c# ./a.out1 12 23 31 1 1 2 2 2 3 3 31 1 1 2 2 2 3 3 3rootlocalhost ansi_c#我們來看其中的要點,數(shù)組為:int a33=(1, 1, 1),(2, 2, 2),(3, 3, 3);函數(shù)原型和調(diào)用為:原型:void fun( int *a, int m, int n)(printf(%d , *( a+i*n+j );)調(diào)用:fun( (int *)a, 3,3);另一個函數(shù)為:原型:void

12、func( int *a, int m, int n)(printf(%d ”,ai);)調(diào)用:func( &a00,3,3);func( (int *)a, 3,3);并在函我們發(fā)現(xiàn)這兩種方式都能正常執(zhí)行,我們把一個二級指針,強制轉(zhuǎn)換成了一級指針傳了進去, 數(shù)中模仿編譯器數(shù)組的尋址方式:*( a+i*n+j )。我們再看看二維字符數(shù)組的例子:/*二維字符數(shù)組*/#include void f( char *a, int n)(int i;printf(%c/n,*( (char*)a+0 );printf(%c/n,(char * )a)n);puts(OK);for(i=0;i3;i+)p

13、rintf(%s/n,(char*)a+i*n );)int main()(char str_arr310 = (yes,no,uncertain);f( (char *)str_arr, 10);return 0;/*end*/運行結(jié)果:rootlocalhost ansi_c# ./a.outOK yes nouncertain rootlocalhost ansi_c#這里也做了強制類型轉(zhuǎn)換,轉(zhuǎn)換成字符指針,printf(%s/n”,(char*)a+i*n );每個字符串的地址就是數(shù)組中字符y、n、u的地址,printf(%c/n,*( (char*)a+0 );字符在數(shù)組中的排列是順

14、序的,可以用 *( (char*)a+i)或(char * )a)i 表示。當(dāng)然這個程序也可以改成這樣,完全不用二級指針:/*/#include void f( char *a, int n)(int i;printf(%c/n,*( a+0 );printf(%c/n,(a)n);puts(OK);for(i=0;i3;i+)printf(%s/n,a+i*n );)int main()(char str_arr310 = (yes,no,uncertain);f( (char *)str_arr, 10);return 0;)/*/歸根結(jié)底,還是把它轉(zhuǎn)成一級指針來用。下面做個小結(jié):數(shù)組傳參

15、數(shù)組:int array410;函數(shù)原型:void func1( int a10);void func2( int (*a)10);void func3( int *p, int col, int row );函數(shù)調(diào)用:func1( array );func2( array );func3( (int *)array, 4, 10 );容易出錯的地方:int arr10;int *p = arr;這種方式是錯誤的.應(yīng)該是int (*p)10 = arr;同理,也不能將arr傳給fun( int *p)另外數(shù)組傳參之后會降級為指針,如:#include void Test(char a2)int

16、 size = sizeof( a );/4int main(void)char a32 = (a,b,c,d,e,f);int size =sizeof( a );/6Test( a );return 0;來源: HYPERLINK /d_life/blog/item/912062ef1fd363e9ce1b3e2a.html /d_life/blog/item/912062ef1fd363e9ce1b3e2a.html函數(shù)原型:要求傳入一個動態(tài)二維數(shù)組void func1(int *p,int row, int column)調(diào)用:int main()int m,n;int *b;cin m;cin n;b = new int *m;for(int i=0; im; i+));func1(b,m,n);return 0;)我習(xí)慣的做法是不用指針數(shù)組,定義一個大塊(這種情況主要面向每行行數(shù)相同):比如現(xiàn)在有一個W*H 的矩陣(H個長度為W的數(shù)組),你就直接定義一個float型指針:float

溫馨提示

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

評論

0/150

提交評論