1. 程式人生 > >C++ 中將二維陣列傳入函式

C++ 中將二維陣列傳入函式

主要有三種方式
void fun(int *a[],int m,int n)//**a
void fun2(int a[][2],int m)//a[2][2]
void fun3(int (*a)[2],int m,int n)//a[2][2];int (*p)[2];p=a;

//c語言中經常需要通過函式傳遞二維陣列,有三種方法可以實現,如下:

//方法一, 形參給出第二維的長度。

#include <stdio.h>

void func(int n, char str[][5])
{
           int i;
           for (i = 0; i < n; i++)
           {
                   printf("\nstr[%d] = %s\n", i, str[i]);
           }
}

void main()
{
           char str[][5] = {"abc", "def", "ghi"};
           func(3, str);
}


//方法二,形參宣告為指向陣列的指標。

#include <stdio.h>

void func(int n, char (*str)[5])
{
           int i;
           for (i = 0; i < n; i++)
           {
                   printf("\nstr[%d] = %s\n", i, str[i]);
           }
}

void main()
{
           char str[][5] = {"abc", "def", "ghi"};
           func(3, str);
}


//方法三,形參宣告為指標的指標。

#include <stdio.h>

void func(int n, char **str)
{
           int i;
           for (i = 0; i < n; i++)
           {
                   printf("\nstr[%d] = %s\n", i, str[i]);
           }
}

void main()
{
           char *p[3];
           char str[][5] = {"abc", "def", "ghi"};
           p[0] = &str[0][0];
           p[1] = str[1];
           p[2] = str[2];
           func(3, p);
}

第2個第3個都可以執行的,我在VC 6測試通過的,
第2個是陣列指標,就是指向一個大小固定的陣列的指標,第3個是指標的指標
***************
陣列與指標有點複雜,這有個例子大家自己測試一下或許就理解了
fun1(int m[2][3][5]){;}//編譯器認為是int(*m)[3][5],m是一個指向int[3][5]的指標
fun2(int m[][3][5]){;}/*同上,不信你這樣測試int t[3][3][5];fun1(t);你或許會驚訝它竟然能編譯通過,我也不敢相信自己的眼睛*/
fun3(int (*m)[3][5]){;}//編譯器認為它是int (*m)[3][5],陣列的指標是不退化的
fun4(int **m){;}
//測試一
int t[2][3][5];
fun1(t);
fun2(t);
fun3(t);
//測試二
int (*p)[3][5]=t;
fun1(p);
fun2(p);
fun3(p);
//測試三
int (*q)[2][3][5]=&t;
fun1(*q);
fun2(*q);
fun3(*q);
//測試四
int h[5][3];
int *i[5];
int **j;
int ***k;
//fun4(h);通不過編譯
fun4(i);
fun4(j);
//fun4(*k);報錯
//有時自己都認為指標和陣列是相同的了,但它們確實有很多差別的

***********

陣列與指標是怎樣被編譯器修改的(出自<<C專家程式設計>>)
ANSI C規則
1:表示式中的陣列名就是指標
2:下標總是與指標的偏移量相同
3:在函式引數的宣告中,陣列名被當作指向該陣列第一個元素的指標
                 實參                形參
陣列的陣列      char[8][10]         char(*)[10]        陣列指標
指標陣列        char *c[15]         char **c           指標的指標
陣列指標        char (*c)[64]       char (*c)[64]       不變
指標的指標      char **c            char **c            不變
***************
void average( int ary[12] );     // 形參ary是一個int *
...
int anArray[] = { 1, 2, 3 };     // 一個具有個元素的陣列
const int anArraySize = sizeof(anArray)/sizeof(anArray[0]);     // == 3
average( anArray );   // 合法

void average( int ary[] );   // 形參ary仍然是一個int *
****************
如果陣列邊界的精確數值非常重要,並且希望函式只接受含有特定數量的元素的陣列,可以考慮使用一個引用形參:
void average( int (&ary)[12] );
現在函式就只能接受大小為12的整型陣列:
average( anArray );   // 錯誤!anArray是一個int [3]!

************
int *anArray2 = new int[anArraySize];
average( anArray2 ); // 錯誤!不可以使用int *初始化int (&)[n]
average_n( anArray, anArraySize ); // 沒問題

*************
多維陣列形參並不比一維陣列來得困難,但它們看上去更具挑戰性
void process( int ary[10][20] );
和一維陣列的情形一樣,形參不是一個數組,而是一個指向陣列首元素的指標。不過,多維陣列是陣列的陣列,因此形參是一個指向陣列的指標
void process( int (*ary)[20] );// 一個指標,指向一個具有20個int元素的陣列
void process( int ary[][20] );   // 仍然是一個指標,但更清晰