『壹』 關於函數形參是二維數組的問題
你那兩個new分配的空間不是連續的Row*Col個double的空間, 算不上二維數組.
你需要連續的空間嗎?
『貳』 c語言c++語言如何用二維數組做形參
C/C++中,二維數組的第一維的每一個元素都是一維數組。所以,用指向一維數組的指針或用第一維維數空缺的二維數組作為函數的形式參數都能達到目的。設處理數組為int型,舉例代碼如下:
//#include"stdafx.h"//Ifthevc++6.0,withthisline.
#include"stdio.h"
voidmyprint(int(*p)[5]){//p是指向有5個int型元素的一維數組的指針
//voidmyprint(intp[][5]){//這樣寫效果是一樣的
inti,j;
for(i=0;i<3;i++){
for(j=0;j<5;printf("%3d",p[i][j++]));
printf(" ");
}
}
intmain(void){
inta[3][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}};
myprint(a);
return0;
}
『叄』 怎樣用2維數組作為函數形參
可以用二維數組名作為實參或者形參,在被調用函數中對形參數組定義時可以指定所有維數的大小,也可以省略第一維的大小說明,如:
void Func(int array[3][10]);
void Func(int array[][10]);
二者都是合法而且等價,但是不能把第二維或者更高維的大小省略,如下面的定義是不合法的:
void Func(int array[][]);
因為從實參傳遞來的是數組的起始地址,在內存中按數組排列規則存放(按行存放),而並不區分行和列,如果在形參中不說明列數,則系統無法決定應為多少行多 少列,不能只指定一維而不指定第二維,下面寫法是錯誤的:
void Func(int array[3][]);實參數組維數可以大於形參數組,例如實參數組定義為:
void Func(int array[3][10]);
而形參數組定義為:
int array[5][10];
這時形參數組只取實參數組的一部分,其餘部分不起作用。
對於數組 int p[m][n];
如果要取p[i][j]的值(i>=0 && i<m && 0<=j && j < n),編譯器是這樣定址的,它的地址為:
p + i*n + j;
void Func(int array[3][10]);
void Func(int array[][10]);
變為:
void Func(int **array, int m, int n);
在轉變後的函數中,array[i][j]這樣的式子是不對的(不信,大家可以試一下),因為編譯器不能正確的為它定址,所以我們需要模仿編譯器的行為把array[i][j]這樣的式子手工轉變為:
*((int*)array + n*i + j);
在調用這樣的函數的時候,需要注意一下,如下面的例子:
int a[3][3] =
{
{1, 1, 1},
{2, 2, 2},
{3, 3, 3}
};
Func(a, 3, 3);
根據不同編譯器不同的設置,可能出現warning 或者error,可以進行強制轉換如下調用:
Func((int**)a, 3, 3);
其實多維數組和二維數組原理是一樣的,大家可以自己擴充的多維數組,這里不再贅述。寫到這里,我先向看了這篇文章後悔的人道歉,浪費你的時間了。下面是一 個完整的例子程序,這個例子程序的主要功能是求一個圖中某個頂點到其他頂點的最短路經,圖是以鄰接矩陣的形式存放的(也就是一個二維數組),其實這個函數 也是挺有用的,但是我們這篇文章的重點在於將二維數組作為函數的參數傳遞。
『肆』 定義一個函數怎麼用二維數組做參數
有兩種方式:
一種為你的這種形式:
print(int a[][3],int n){}
另一種為print(int (*a)[3],int n){}
為二維數組時,第二維不能省略,並且最好與實參的第二維一樣。
在調用時,只要寫二維數組名即可。可以寫成print(a,5);實參數組名為a的情況下。
『伍』 「c語言」和「c++語言」如何用二維數組做形參
二維數組做形參?C++的數組用形參的時候非常之弱,你確定你需要它?
N維數組做形參必須指定後n-1維的大小,不然編譯器無法知道如何使用它,
如
void func(int a[][10]) 或 void func2(int b[][10][10])
雖然寫是可以這樣子寫,不過,其實上面那種代碼等價於
void func(int (*a)[10]) 和 void func2(int (*b)[10][10])
『陸』 二維數組做形參的表示方法
例如下面這個
int fun(int a[2][3],int n);
或者
int fun(int a[][3],int n);
要指出列數是多少,行數寫不寫都一樣,行數要通過n進行傳遞。
假設
int b[2][3]={};
則調用的時候可以寫
fun(b,2);
『柒』 C語言中如何將二維數組作為函數的參數傳遞
在C語言中可以用二維數組作為實參或者形參。
1、函數中用二維數組作為形參,函數聲明中可以指定所有維數的大小,也可以省略第1維的維數如:
voidf(intarray[3][10]);//正確
voidf(intarray[][10]);//正確
上面的兩種二維數組形參表示都是正確的。
2、函數中用二維數組作為形參,不能把第2維或者更高維的大小省略,如下面的定義是不合法的:
voidf(intarray[][]);//錯誤
因為從實參傳遞來的是數組的起始地址,在內存中按數組排列規則存放(按行存放),而並不區分行和列,如果在形參中不說明列數,則系統無法決定應為多少行多少列,不能只指定一維而不指定第二維,下面寫法是錯誤的:
voidf(intarray[3][]);//錯誤
3、二維數組作為實參傳遞時,必須保證實參第2維的維數與形參第2維的維數相同,因為必須要保證形參和實參的數據類型一致。比如定義如下函數:
voidf(intarray[][10]);
可以將如下數組傳遞給函數f。
inta[2][10]={1,2,3,4};
intb[4][10]={1};
『捌』 c語言中怎麼用二維數組作為函數參數
C語言中
指針做函數參數傳遞二維數組有兩種基本方法:1、傳遞「數組指針」<pre
t="code"
l="cpp">#include
<stdio.h>
void
output(
int
(*pa)[3],
int
n
)//這個函數只能輸出n行3列的二維數組
{
int
i,j;
for(
i=0;i<n;i++
){
for(
j=0;j<3;j++
)
printf("%d
",
pa[i][j]
);
printf("\n");
}
}
void
main()
{
int
a[2][3]={
{1,2,3},
{4,5,6}
};
output(a,2);
}2、傳遞「指針數組」
先將二維數組的行指針存儲到一個指針數組中,再將指針數組傳遞到子函數中去。<pre
t="code"
l="cpp">#include
<stdio.h>
void
output(
int
*pa[],
int
row,int
col
)
//這個函數更通用,但調用前,要做好准備工作。
{
int
i,j;
for(
i=0;i<row;i++
){
for(
j=0;j<col;j++
)
printf("%d
",
pa[i][j]
);
printf("\n");
}
}
void
main()
{
int
a[2][3]={
{1,2,3},
{4,5,6}
};
int
i;
int
*pa[2];
for(
i=0;i<2;i++
)
pa[i]=a[i];
output(pa,
2,
3);
}
『玖』 關於C語言的二維數組作為函數參數的問題
所謂二維數組,實際上是指向數組的指針,比如:
int n=2,m=3;
int arr[n][m];
實際上相當於:
int n=2,m=3;
int (*arr)[m];
所以,傳遞二維數組作為參數,實際上就是傳遞了一個指針。
將形參的類型定義成int*,再在函數內部轉換回指向數組的指針就行了,比如:
void f(int *p,int row,int column)
{
int (*arr)[column]=(int (*)[column])p;
//使用二維數組arr
}
這樣傳遞參數:
int n=5,m=6;
int arr[n][m];
f((int*)arr,n,m);
下面是一個例子:
#include <stdio.h>
void f(int *p,int row,int column)
{
int (*arr)[column]=(int (*)[column])p;
for(int i=0;i<row;i++)
{
for(int j=0;j<column-1;j++)
printf("%d,",arr[i][j]);
printf("%d ",arr[i][column-1]);
}
}
int main()
{
int n;
scanf("%d",&n);
int arr[n][n];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
arr[i][j]=i*n+j;
}
f((int*)arr,n,n);
return 0;
}
這是運行截圖: