C++ 中將二維陣列傳入函式
阿新 • • 發佈:2019-01-11
主要有三種方式
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] ); // 仍然是一個指標,但更清晰
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] ); // 仍然是一個指標,但更清晰