




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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 )調用:func1( str_arr );func2( str_array);如果向func2()中傳入str_arr會怎么樣呢?編譯器會警告:傳遞參數(shù)1 (屬于func2時在不兼容的指 針類型間轉換。即虛參與實參類型不一致。同理,也不能向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*/運行結果: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)時在不兼容的指針類型間轉換test.c:23:警告:傳遞參數(shù)1 (屬于func2)時在不兼容的指針類型間轉換這兩種數(shù)組的正確賦值應該如下:char str_arr310 = (yes,no,uncertain);char *str_array = (yes,no,unsure);char (*pa)10 = str_arr;char *p = str_array;pa和p才是和他們相一致的類型。當然,如果不是傳參的話,在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;)/*/運行結果: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ù)組傳參有什么奧秘,而非只針對這一個 問題提出解決方法。后面從基礎的開始討論。我們先看看教材上怎么講這一塊的,譚浩強的C程序設計二維數(shù)組作為參數(shù)傳遞,原文如下(略有改變,請原諒):原文開始可以用二維數(shù)組名作為實參或者形參,在被調用函數(shù)中對形參數(shù)組定義時可以可以指定所有維數(shù) 的大小,也可以省略第一維的大小說明,如:void Func(int array310
7、);void Func(int array 10);二者都是合法而且等價,但是不能把第二維或者更高維的大小省略,如下面的定義是不合法的:void Func(int array);因為從實參傳遞來的是數(shù)組的起始地址,在內存中按數(shù)組排列規(guī)則存放(按行存放),而并不區(qū)分行 和列,如果在形參中不說明列數(shù),則系統(tǒng)無法決定應為多少行多少列,不能只指定一維而不指定第二 維,下面寫法是錯誤的:void Func(int array3);實參數(shù)組維數(shù)可以大于形參數(shù)組,例如實參數(shù)組定義為:void Func(int array310);而形參數(shù)組定義為:int array510;這時形參數(shù)組只取實參數(shù)組的一部分,
8、其余部分不起作用。原文結束也就是說多維數(shù)組傳參要指定第二維或者更高維的大小,可以省略第一維的大小。像int array34,要傳參的話,函數(shù)原型可以為下面三種的任一種:void func(int a34)void func(int a4)void func(int (*a)4)調用時為:func(array);同時教材里也說了,如果在型參里不說明列數(shù),則編譯器無法決定應為多少行多少列。那么能不 能把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#雖然從本質上講int array34的數(shù)組名相當于二級指針,但它不等同于一般的二級指針,因為它還 含有數(shù)組相關的信息,所以在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ù)原型和調用為:原型:void fun( int *a, int m, int n)(printf(%d , *( a+i*n+j );)調用:fun( (int *)a, 3,3);另一個函數(shù)為:原型:void
12、func( int *a, int m, int n)(printf(%d ”,ai);)調用:func( &a00,3,3);func( (int *)a, 3,3);并在函我們發(fā)現(xiàn)這兩種方式都能正常執(zhí)行,我們把一個二級指針,強制轉換成了一級指針傳了進去, 數(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*/運行結果:rootlocalhost ansi_c# ./a.outOK yes nouncertain rootlocalhost ansi_c#這里也做了強制類型轉換,轉換成字符指針,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 表示。當然這個程序也可以改成這樣,完全不用二級指針:/*/#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;)/*/歸根結底,還是把它轉成一級指針來用。下面做個小結:數(shù)組傳參
15、數(shù)組:int array410;函數(shù)原型:void func1( int a10);void func2( int (*a)10);void func3( int *p, int col, int row );函數(shù)調用:func1( array );func2( array );func3( (int *)array, 4, 10 );容易出錯的地方:int arr10;int *p = arr;這種方式是錯誤的.應該是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)調用: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;)我習慣的做法是不用指針數(shù)組,定義一個大塊(這種情況主要面向每行行數(shù)相同):比如現(xiàn)在有一個W*H 的矩陣(H個長度為W的數(shù)組),你就直接定義一個float型指針:float
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中小企業(yè)人員書面勞動合同
- 綠色低碳產(chǎn)業(yè)項目合作合同
- 砂礫石供貨合同
- 危險廢物運輸合同協(xié)議
- 煤炭銷售合同
- 環(huán)保項目資金籌措及使用協(xié)議
- 新能源汽車充電基礎設施建設合作合同
- 2023-2024學年高中信息技術選修2(浙教版2019)-網(wǎng)絡基礎-教學設計-2.2-網(wǎng)絡體系結構與TCPIP協(xié)議
- 劇組場地使用損壞賠償協(xié)議
- 粵教版高中信息技術必修教學設計-2.3 信息的鑒別與評價-
- 中考英語1600詞匯對照表-(帶音標)
- 虛擬化與云計算技術應用實踐項目化教程 課件全套 陳寶文 項目1-8 虛擬化與云計算導論- 騰訊云服務
- (正式版)JBT 7248-2024 閥門用低溫鋼鑄件技術規(guī)范
- 2024廣東高壓電工考試電工證考試題模擬試題(全國版)
- JJG 705-2014液相色譜儀行業(yè)標準
- 人工智能小學生科普書
- (高清版)TDT 1056-2019 縣級國土資源調查生產(chǎn)成本定額
- 公司合作計劃書
- 2016-2023年南京信息職業(yè)技術學院高職單招(英語/數(shù)學/語文)筆試歷年參考題庫含答案解析
- 化學實驗室設備期間核查規(guī)程匯編2019.9最終版
- 跨領域聯(lián)合診療(MDT)管理法規(guī)
評論
0/150
提交評論