c語言把數組作為參數
『壹』 c語言中數組作為函數參數的問題。
E
數組作為參數不需要標示大小
A
數組參數在函數中要被隱式轉換為一個常量指針在使用
F
定義數組值為int
a[i]
這里的i應該是一個編譯時期決定大小常量表達式。
『貳』 C語言 數組作為參數傳遞問題
不是寫法的問題,可能你對數組的具體含義還不太清楚哈。
一個一維數組的數組名是指向這個數組首地址的指針,比如:
int a[3]={1,2,3};
printf("%d",*a);
輸出:1
a就是指向這個數組的首地址的指針,當用:
int *b;
b=a+1;//a地址加1,指向下一個元素
printf(%d",*b);
輸出:2
二維數組名是指向數組首行的指針,與一維類似,但區別也很大,具體的你去翻你的課本吧,沒課本去網路。
在說函數,先說了,數組名其實就是指針,但a[2]這就是數值了,所以在申明函數的時候你可以這樣申明(或定義):
static void DisplayBoard(char board[][3])
{printf("%c",board[0][0]);}
也可以這樣申明(或定義):
static void DisplayBoard(char *board)
{printf("%c",board[0][0]);}
這兩種申明方式是等價的,都可以用下標法訪問。
在調用的時候,函數要求的是輸入數組,如果你用:
DisplayBoard(board[3][3]);
這是不行的,board[3][3]是一個數值,而不是一個數組,數組做參數時是將數組首地址傳遞給函數了,所以用數組名或者用指針都可以:
char *a;
a=board
//下面兩種效果是一樣的
DisplayBoard(board);
DisplayBoard(a);
『叄』 c語言 數組作為參數傳遞
調用時把【】去掉,表示掉用這個數組的所有元素,數組的名稱表示數組第一個元素的地址。
數組的定義可以寫成: int table[]={1,2,3,} 或者table[3],不能寫成table[],因為系統在定義數組時就給數組分配了地址,table[]沒有確定元素的個數,不能分配地址空間。
但是作為形參,可以這樣寫,void tab(int table[]) ,不知道為什麼,呵呵
『肆』 C語言數組變數作為函數參數
將數組傳遞給函數後,數組就會退化為指針
voidfun(intx,intpp[],int*n)
voidfun(intx,int*pp,int*n)
//這兩種寫法是等價的
pp[j++]=j;//這句寫錯了回
//要保存到答pp里的是能整除的整數,而不是計數器j,如果這么寫,那麼pp的值肯定是{0,1,2,3,4,5,...}
//應該改成
pp[j++]=l;//L才是被整除的整數,要保存的是這個
*n=j;//n作為一個指針,負責傳出得到的數字的數量,j是計數器,當所有的計算完畢後,j的值自然是這些數字的數量
『伍』 C語言中數組作為函數參數
C中數組名代表該數組的首地址,
char
s[]="abc";
s代表的就是『a』在內存中的地址
以地址作參數
,實參和形參同時改變
『陸』 關於C語言數組作為函數的實參和形參的問題
函數傳遞數組的話,其實傳遞收地地址就好,把數組首地址傳給函數的形參(這個形參務必定義為對應類型的指針),形參可以以指針的形式訪問數組的內容,也可以直接用數組的方式訪問
『柒』 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,可以進行強制轉換如下調用:
Func((int**)a, 3, 3);
其實多維數組和二維數組原理是一樣的,大家可以自己擴充的多維數組,這里不再贅述。寫到這里,我先向看了這篇文章後悔的人道歉,浪費你的時間了。下面是一 個完整的例子程序,這個例子程序的主要功能是求一個圖中某個頂點到其他頂點的最短路經,圖是以鄰接矩陣的形式存放的(也就是一個二維數組),其實這個函數 也是挺有用的,但是我們這篇文章的重點在於將二維數組作為函數的參數傳遞。
『捌』 C語言技巧:怎樣把數組作為參數傳遞給函數
使用pointer(指針)即可.
ex:
voidfunc(int*ptr,intlen);
intarray[10];
test()
{
....
func(&array[0],10);//將第一個指針傳過去,並帶上長度
....
}