C語言二維數組作為函數參數


設有整型二維數組a[3][4]如下:
0   1   2   3
4   5   6   7
8   9  10  11 
它的定義為:
    int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}
設數組a的首地址為1000,各下標變量的首地址及其值如圖所示。


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



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

更多的見: http://c.biancheng.net/cpp/html/79.html


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

 

 

int array[3][3];

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 <iostream>

using namespace std;

 

int main()

{

int c[4]={1,2,3,4};

int *a[4]; //指針數組

int (*b)[4]; //數組指針

b=&c;

//將數組c中元素賦給數組a

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

{

a[i]=&c[i];

}

//輸出看下結果

cout<<*a[1]<<endl; //輸出2就對

cout<<(*b)[2]<<endl; //輸出3就對

return 0;

}

(int *array)[N] 和int **的區別

Int ** p,就是一個指針,這個指針指向了int* 也就是一個整型數組,p是指向了整數數組的指針,p中是整數數組的地址,(int *array)[N] 和int **的區別就在於每行的元素個數固不固定

傳遞二維數組參數

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

...

printf("\t%d", *(*array +i*n +j));

...

}

 

int main() {

  int array[3][3] = {

{1,2,3},

{4,5,6},

{7,8,9}

};

...

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 <iostream>

using namespace std;

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

{

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

cout<<a[i]<<endl;

}

int main()

{

int a[5]={0};

output(a);

getchar();

return 0;

}

 

法四。二維數組指針作為形參

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

{

 

}

 

int main()

{

int array[10][10];

func4(&array);

 

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM