將陣列(含多維)傳入副函式- CYCU-EE-C

文章推薦指數: 80 %
投票人數:10人

printf(“%d”, A[0] ); 這樣輸出的答案是2,這樣大概了解陣列等於指標的事情了吧! 所以到底該怎麼傳入副程式 ... CYCU-EE-CSearchthissite NavigationHomeLecture1Lecture2Lecture3Lecture4Lecture5Lecture6Lecture7Lecture8Lecture9Lecture10Lecture11Lecture12Lecture13Lecture14Lecture15ProgrammingAssignmentCoursesSitemap LinksCNSRLStudentsComputing&NetworkingLabResourcesManual計算機網路環境使用者/管理者手冊VerilogHDL StudyGroupDr.Lai'sHomePage RecentsiteactivityHomeeditedbyYukuenLaiReferenceseditedbyYKCYCUEEHomeeditedbyYKCYCUEEStudent_PageseditedbyYKCYCUEECourseseditedbyYKCYCUEEViewAll Home‎>‎OtherApplication‎>‎ 將陣列(含多維)傳入副函式 首先,複習一下副函式的標頭標準格式:回傳值型態副程式名(傳入值1的型態,傳入值2的型態,....)EX.inttest(int,float)而副函式的主體則是inttest(inta,floatb){程式內容return回傳值;}注意!與標頭不同的地方在於標頭只需要宣告傳入型態,而主體則是要宣告型態與變數名字,才能在副程式裡使用傳進來的東西。

接下來重點來了,要如何傳陣列進入副程式呢?這邊說明的是利用指標的方式傳入,當然可能有其它方式,但這邊就不多說了首先要知道陣列本身就是指標的一種,而陣列的第一格就是指標的頭,用範例說明會比較清楚EX.A[1]=1;*(A+1)=2;printf(“%d”,A[0]);這樣輸出的答案是2,這樣大概了解陣列等於指標的事情了吧!所以到底該怎麼傳入副程式呢?一樣用範例來說比較容易EX.#include"stdio.h"#include"stdlib.h"voidtest(int*);//標頭採用整數指標的方式傳入值intmain(){intarr[3]={0},i=0;test(&arr[0]);for(i=0;i<3;i++)printf("%d",arr[i]);system("pause");}voidtest(int*arr){inti;for(i=0;i<3;i++)arr[i]=1;}最後印出的結果應該會是111也許有人會問說,這程式是錯的啦!副程式沒有回傳陣列給主程式啊~怎麼可能在主程式印出來會是111呢?應該是000才對吧!聽起來好像很合理,但是別忘記了,指標是個記憶體位置,不論主程式與副程式,他的記憶體位置都是一樣的,所以在副程式裡面修改記憶體位置存的值時,就相當於主程式那邊的值也做了修改,當然這樣就不需要回傳值了。

如果我們要傳的是浮點數的陣列呢?用上面的範例做個修改就OK了EX.#include"stdio.h"#include"stdlib.h"voidtest(float*);//標頭採用浮點數指標的方式傳入值intmain(){floatarr[3]={0};inti=0;test(&arr[0]);for(i=0;i<3;i++)printf("%.2f",arr[i]);system("pause");}voidtest(float*arr){inti;for(i=0;i<3;i++)arr[i]=1.5;}所以輸出就會是1.501.501.50這邊就要說一個簡單的概念了,記憶體分配是以一格一格來分的,傳入的資料型態會決定記憶體的使用標準格數為多少,這樣才能正確使用。

舉例來說inttest[3]={0};test[1]=2;會相當於*(test+1)=2;這時候test後面的[+1]其實是代表+1套標準位元組,因為這邊是整數的型態,所以1套就代表是4bytes,若是將int改成floatdoubletest[3]={0};*(test+1)=2;這時候的[+1]代表的就是加上8個位元組,因為精準浮點數在記憶體中是8個位元組為一單位這時候應該有反應快的會想說那float跟int都是4個位元組那能不能混用呢?答案是不行的,因為浮點數跟整數的判斷方法不一樣,同樣4個位元組裡用整數去判別跟用浮點數去判別會出現不一樣的結果,所以是不能混用的。

但是不要搞混了,指標依然會是一個整數的記憶體位置,前面的資料型態只是代表該怎麼去使用資料辨別方式與記憶體空間的判讀方法。

最後就來說說那多維陣列要怎麼傳進去呢?一樣,先來看看下面矩陣相加的例子EX.#include"stdio.h"#include"stdlib.h"voidarraysum(float*,float*,float*);//矩陣相加副程式inti=0,j=0;//跑for使用intmain(){floatarr1[3][3]={1},arr2[3][3]={1},ans[3][3]={0};//arr12為輸入ans為輸出答案arraysum(&arr1[0][0],&arr2[0][0],&ans[0][0]);printf("\n答案為:\n");for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%2.1f",ans[i][j]);//輸出相加結果printf("\n");}system("PAUSE");return0;}voidarraysum(float*arr1,float*arr2,float*ans){for(i=0;i<3;i++){for(j=0;j<3;j++)ans[i*3+j]=arr1[i*3+j]+arr2[i*3+j];//兩陣列相加}}最後的輸出結果應該會是222222222我覺得最需要說明的應該就只有ans[i*3+j]=arr1[i*3+j]+arr2[i*3+j];這句吧!這裡就要扯到多維陣列的分配方式了簡單說,多維陣列是為了人類方便所設計的,實際上他仍是一維的陣列。

以三維方塊陣列(inta[3][3])為例子a[1][2]=3實際上會相當於a[5]=3的結果,以指標來看就會是*(a+1*3+2)=3這樣應該可以了解吧~每一列的開始其實是接著上一列的位置繼續的,所以可以說其實它根本就是一維陣列的另外一種表示法而已,現在再回去看看上面的範例應該就可以看懂了^^取自仔仔的學習筆記本http://cghlearnnote.blogspot.com/search/label/C%E8%AA%9E%E8%A8%80%E8%88%87%E8%B3%87%E6%96%99%E7%B5%90%E6%A7%8B有問題歡迎指教[email protected] Comments Signin|RecentSiteActivity|ReportAbuse|PrintPage|PoweredByGoogleSites



請為這篇文章評分?