C C 函式傳遞二維陣列

2021-10-10 16:19:08 字數 1813 閱讀 1914

目錄

函式引數傳遞二維陣列的問題

解決方案

1.傳遞第二維和更高維的大小

2.根據陣列的儲存原理把二位陣列當作一維陣列來操作(降維處理)

將二維陣列當作引數的時候,必須指明所有維數大小或者省略第一維的,但是不能省略第二維或者更高維的大小,這是由編譯器原理限制的。在學編譯原理的時候知道編譯器是這樣處理陣列的:

對於陣列 int p[m][n];

p + i*n + j;

從以上可以看出,如果我們省略了第二維或者更高維的大小,編譯器將不知道如何正確的定址。

這與資料型別類似,試想如果沒有資料型別的區別,編譯器如何定址呢?8位的還是16位的?還是32位的?也就是編譯器必須要知道它乙個單元佔多長的記憶體,至於內訓裡有多少個單元,是可以不用知道的。

舉個形象的例子,這裡有一堆蘋果,老闆讓你把他們裝起來。試想,你問老闆「這總共是多少筐」重要還是問老闆「一筐裝幾個」重要?只要老闆告訴你一筐裝幾個,你管他能裝幾筐!老闆知道就行了,你就不用管了。

在編譯一維陣列形參的函式原型時,既可以把它寫成陣列的形式,也可以把它寫成指標的形式,但是對於多維陣列,只有第一維可以進行如此選擇!想要把二維陣列形參的函式原型寫成下列這種方式是不對的:

void func(int **array, int m, int n);

那問題就來了,我們該怎麼傳遞二維陣列引數呢?

總的來說解決方法有兩個

既然第二維和更高維度的大小必須指定,那就指定好了。但是既然指定了該函式引數中的二位陣列的大小,就要經常根據使用情況對其大小進行修改,所以最好定義為乙個巨集定義。**如下

#include #define m 4

#define n 6

int a[m][n] = ,

, ,,};

void arrayprint(int a[n], int m, int n);//遍歷列印二維陣列a[i][j]

int main()

void arrayprint(int a[n],int m,int n)//遍歷列印二維陣列a[i][j]

printf("\n");

}}

此外前文說到,在編譯一維陣列形參的函式原型時,既可以把它寫成陣列的形式,也可以把它寫成指標的形式,但是對於多維陣列,其第一維可以進行如此選擇!因此第一維度也可以改為指標:void arrayprint(int (*a)[5], int n, int m)

前面已經提到,即使是二維陣列,其在記憶體中的儲存也是順序的儲存。

對於陣列 int p[m][n];

既然這樣,我們就也可以通過指標來定址二維陣列。也就是說我們傳遞乙個指向二維數起始記憶體的指標就可以實現對二維陣列的操作,那我們只需要傳遞乙個指向二維陣列的首位址的指標就行了。示例**如下

#include #define m 4

#define n 6

int a[m][n] = ,

, ,,};

void arrayprint(int* a, int m, int n);//遍歷列印二維陣列a[i][j]

int main()

void arrayprint(int *a,int m,int n)//遍歷列印二維陣列a[i][j]

printf("\n");

}}

C C 二維陣列的引數傳遞與二維指標

在進行函式引數傳遞的時候,常常需要把一組資料傳遞給函式,我們知道一維陣列在進行函式引數傳遞的時候,以陣列名作為形參就可以,因為陣列名就表示該陣列的首位址,在函式內部也直接可以用符號訪問。那麼二維陣列的值該如何傳遞呢?其實它可以像一維陣列那樣以陣列名作為形參和實參,也可以使用二級指標來進行傳遞,常用的...

C C 二維陣列

已知在c c 中當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。1 二維陣列的概念 在c語言中,二維陣列實際上是一種特殊的一維陣列,它的每個元素也是乙個一維陣列。因此,二維陣列下標形式正確寫法如下 int arrays i j 2 二維陣列作為函式引數 傳遞陣列時必須讓編譯器知道陣列最...

給函式傳遞二維陣列指標

很多時候,函式的形參很容易定義為指標的指標形式 如 int number 這樣可用來表示指向整型指標的指標,但我們傳遞的可是乙個二維陣列,其指標該是指向整型陣列的指標。這就是容易出現模糊的點。那如果形參形式是 int number 這種形式也是有其優點的,從例子中來說明 先定義實參 int inpu...