Ⅰ c語言 二維數組的列 事先未知(要用戶輸入) 怎樣把這個數組作為參數傳遞給函數
intfunc(int**a){
input(size);
malloc(a,size);
dosomething;
free(a);
}
Ⅱ C語言,以二維數組作為參數傳入時數據丟失
代碼和參數沒有問題,matrixA是指向一個包含兩個元素的一維數組的行指針,按傳參被初始化為指向二維數組A11的第一行,所以看到的是第一行的兩個數據。行指針加一可以指向第二行,不是數據丟失。
Ⅲ 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語言中如何將二維數組作為函數的參數傳遞
�部梢允÷緣諞晃�拇笮∷得鰨�紓�
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,可以進行強制轉換如下調用:
其實多維數組和二維數組原理是一樣的,大家可以自己擴充的多維數組,這里不再贅述。寫到這里,我先向看了這篇文章後悔的人道歉,浪費你的時間了。下面是一 個完整的例子程序,這個例子程序的主要功能是求一個圖中某個頂點到其他頂點的最短路經,圖是以鄰接矩陣的形式存放的(也就是一個二維數組),其實這個函數 也是挺有用的,但是我們這篇文章的重點在於將二維數組作為函數的參數傳遞。
Ⅳ c語言中怎麼用二維數組作為函數參數
二維數組作為函數參數,實參可以直接使用二維數組名,在被調用函數中對形參數組定義可以指定所有維數的大小,也可以省略第一維的大小說明,如:
因為從實參傳遞來的是數組的起始地址,如果在形參中不說明列數,編譯器將無法定位元素的的位置。
Ⅵ C語言中 指針做函數參數傳遞二維數組
#include <stdio.h>
void fun(int (*p1)[3],int (*p2)[3]);
int main()
{
int p1[3][3]={{7,8,9},{4,5,6},{1,2,3}} ;
int p2[3][3] = {0};
int i = 0, j = 0;
fun(p1,p2);
for(i = 0;i < 3;i++){
for(j = 0;j < 3;j++){
printf("%d ",*(*(p2+i)+j));
}
printf(" ");
}
return 0;
}
void fun(int (*p1)[3],int (*p2)[3])
{
int i = 0,j = 0;
for(i = 0;i < 3;i++){
for(j = 0;j < 3;j++){
*(p2[j]+i) = *(p1[i]+j);
}
}
}
(6)c語言二維數組作為參數擴展閱讀:
函數指針的聲明方法為:
返回值類型 ( *指針變數名) ([形參列表]);
其中,「返回值類型」說明函數的返回類型,「(指針變數名 )」中的括弧不能省,括弧改變了運算符的優先順序。若省略整體則成為一個函數說明,說明了一個返回的數據類型是指針的函數,後面的「形參列表」表示指針變數指向的函數所帶的參數列表。例如:
int func(int x); /* 聲明一個函數 */
int (*f) (int x); /* 聲明一個函數指針 */
f=func; /* 將func函數的首地址賦給指針f */
或者使用下面的方法將函數地址賦給函數指針:
f = &func;
賦值時函數func不帶括弧,也不帶參數,由於func代表函數的首地址,因此經過賦值以後,指針f就指向函數func(x)的代碼的首地址。
網路-函數指針
Ⅶ C語言中如何將二維數組作為函數的參數傳遞
函數原型 type fun (type (name*)[size])
type是你要定義的類型,fun是函數名,name是在函數中二維數組的名字,
size是二維數組第2維的長度。
這樣調用這個函數只需要把二維數組函數名傳遞就可以了。
Ⅷ C語言 動態二維數組作為參數的問題
把hpos改定義為行指針——
int (*hpos)[2];
然後分配內存,只要分配一次——
hpos = calloc(2*n*sizeof(long));
Ⅸ C語言怎麼以二維數組作為參數傳遞的問題
考慮要把a作為參數傳入到print中,那麼print函數就要定義一個接收二維數組的參數,那麼什麼參數能接收二維數組呢。
就是print(int (*newbuf)[3])
然後newbuf的地址就是a的地址,然後newbuf[i][j]來訪問每一個元素了
有問題繼續問哈,寫的可能不太明白
Ⅹ C語言中如何將二維數組作為函數的參數傳遞
在c語言中可以用二維數組作為實參或者形參。
1、函數中用二維數組作為形參,函數聲明中可以指定所有維數的大小,也可以省略第1維的維數如:
void f(int array[3][10]); //正確
void f(int array[][10]); //正確上面的兩種二維數組形參表示都是正確的。
2、函數中用二維數組作為形參,不能把第2維或者更高維的大小省略,如下面的定義是不合法的:
void f(int array[][]); //錯誤
因為從實參傳遞來的是數組的起始地址,在內存中按數組排列規則存放(按行存放),而並不區分行和列,如果在形參中不說明列數,則系統無法決定應為多少行多少列,不能只指定一維而不指定第二維,下面寫法是錯誤的:
void f(int array[3][]); //錯誤 3、二維數組作為實參傳遞時,必須保證實參第2維的維數與形參第2維的維數相同,因為必須要保證形參和實參的數據類型一致。比如定義如下函數:
void f(int array[][10]);可以將如下數組傳遞給函數f。
int a[2][10] = {1,2,3,4};
int b[4][10] = {1};