C語言二維陣列作為函式引數

2022-05-14 01:24:47 字數 3194 閱讀 1672

設有整型二維陣列a[3][4]如下:

0   1   2   3

4   5   6   7

8   9  10  11 

它的定義為:

int a[3][4]=,,}

設陣列a的首位址為1000,各下標變數的首位址及其值如圖所示。

前面介紹過,c語言允許把乙個二維陣列分解為多個一維陣列來處理。因此陣列a可分解為三個一維陣列,即a[0]、a[1]、a[2]。每乙個一維陣列又含有四個元素。

例如a[0]陣列,含有a[0][0],a[0][1],a[0][2],a[0][3]四個元素。

更多的見:

陣列及陣列元素的位址表示如下:從二維陣列的角度來看,a是二維陣列名,a代表整個二維陣列的首位址,也是二維陣列0行的首位址,等於1000。a+1代表第一行的首位址,等於1008。如圖:

array的型別既不是int **

更不是(int *a)[4]

而是int [3][3]

只是作為右值時才轉換成

int (*a)[4] a是指向乙個有4個元素的陣列的指標,事實上這個a此時指向a[0],指向陣列,就是說a裡儲存著陣列的位址,就是1000

指標陣列:

array of pointers

,即用於儲存指標的陣列,也就是陣列元素都是指標

陣列指標:

a pointer to an array

,即指向陣列的指標

還要注意的是他們用法的區別,下面舉例說明。

int* a[4]    

指標陣列

表示:陣列

a中的元素都為

int型指標

元素表示:

*a[i]   *(a[i])

是一樣的,因為

優先順序高於

*int (*a)[4]  

陣列指標

表示:指向陣列

a的指標

元素表示:

(*a)[i]  

#include

using namespace std;

int main()

int c[4]=;

int *a[4]; //指標陣列

int (*b)[4]; //陣列指標

b=&c;

//將陣列c中元素賦給陣列a

for(int i=0;i<4;i++)

a[i]=&c[i];

//輸出看下結果

int ** p,就是乙個指標,這個指標指向了int* 也就是乙個整型陣列,p是指向了整數陣列的指標,p中是整數陣列的位址,(int *array)[n] 和int **的區別就在於每行的元素個數固不固定

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

,func(array,3,3);

這樣傳遞二維陣列是錯的,因為型別不匹配,是因為陣列實際型別是int [3][3],在作為右值時可以被轉化為int (*)[3],它們都和int **不同,自然不可用。

法一 直接使用陣列型別:因為陣列實際型別是int [3][3]

可以用二維陣列名作為實參或者形參,在被呼叫函式中對形引數組定義時可以指定所有維數的大小,也可以省略第一維的大**明,如:

void func(int array[3][10]);

void func(int array[10]);

二者都是合法而且等價,但是不能把第二維或者更高維的大小省略,如下面的定義是不合法的:

void func(int array);

因為從實參傳遞來的是陣列的起始位址,在記憶體中按陣列排列規則存放(按行存放),而並不區分行和列,如果在形參中不說明列數,則系統無法決定應為多少行多 少列,不能只指定一維而不指定第二維

法二.一維陣列指標作為形參

void func2(int (*parray)[10])

void func2_1(int (*parray)) //編譯通過,無法呼叫

int main()

int array[10][10];

func2(array);

把array[0] 陣列的指標傳給了func2 因為array是指向10個元素的陣列的指標,(*array)就是array[0],(*array)[0] 就是array[0][0]

法三.二維陣列引用作為形參

void func3(int (&parray)[10][10])

int main()

int array[10][10];

func3(array);

以下是一維陣列引用的例子

#include

using namespace std;

void output(int (&a)[5])

for(int i = 0; i < 5; i++)

cout

int a[5]=;

output(a);

getchar();

return 0;

法四。二維陣列指標作為形參

void func4(int (*parray)[10][10])

int main()

int array[10][10];

func4(&array);

C語言 二維陣列作為函式引數

想來學c語言的人,都會覺得陣列並不是很難,一問c語言最難的是什麼?指標?結構體?今天我就以我們認為不難的陣列聊聊。上學的時候老師就告訴我們 乙個就想當與乙個 這句話有問題嘛?答案是沒問題。但是,就是因為這個沒問題,導致工作中有問題。乙個簡單的思考 int arr 4 5 int p arr 請問,有...

C語言二維陣列作為函式引數傳遞

二維陣列中元素排列的順序是按行存放的,即在記憶體中先順序存放第一行的元素,再存放第二行的元素.二維陣列作為函式引數,實參可以直接使用二維陣列名,在被呼叫函式中對形引數組定義可以指定所有維數的大小,也可以省略第一維的大 明,如 void f int a 3 4 void f int a 4 它們是合法...

二維陣列 作為函式引數

前言 今天在實現裝配線排程程式時候,用到了二維陣列,並將其作為函式的引數。在寫程式的時候,遇到一些問題,即二維陣列做函式的引數應該如何正確表示。我寫程式的錯誤如下程式所示 1 include 2 void print int a 3 3 67intmain 8 10print a 11return0...