c語言函數形參數組
A. c語言怎麼將數組作為函數參數傳入
一維數組的元素作為函數實參,與同類型的簡單變數作為實參一樣,是單向的值傳遞,即數組元素的值傳給形參,從而形參是改變不影響實參
數組名代表著整個數組的地址,如果一維數組的名字作為函數實參,傳遞的是整個數組,即形參數組和實參數組完全相同,是存放在同一存儲空間的同一個數組。這樣形參數組
修改時,實參數組也同時被修改了。形參數組的元素個數可以省略。
#include<stdio.h>
//數組作為函數參數,可以省略元素個數
//數組作為函數參數,傳遞是整個數組的地址,修改了函數形參數組元素的值,會影響到外面的實參數組
void change(int array[])
{
printf("array ==%p\n",array);
array[0] = 100;
}
int main()
{
int ages[6] = {10,11,13,15,11,18};
printf("array ==%p\n",ages);
change(ages);
printf("%d\n",ages[0]);
return 0;
}
輸出結果為: array ==0x7fff5be26c00
array ==0x7fff5be26c00
100
B. 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;
}
C. c語言函數的形參為指針變數時,對應的實參可以是數組名。怎麼理解呀
舉例:
void f(int *p)
{
}
int arr[]={1,2,3};
因為函數f的形參是一個類型為int的指針變數,所以調用f時,可以將數組名arr作為實參傳給形參p。即可以這樣調用:f(arr);
D. 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};
E. C語言自定義函數形參為數組名有必要返回值嗎
如果僅僅為了修改數組的值,是不需要返回值了,因為代表了一個單元。
但是按照規范來說,最好每一個調用函數都有一個返回值比較安全。例如當你做容錯的時候也方便多了。
樓下的哥們,就算是改變值也沒有必要返回值,注意他的參數是一個數組名,是一個地址。
F. C語言中函數定義形參為數組時的問題
1.數組為參數傳遞的是數組首地址,而不是元素的值,而你說的a[size]僅僅是值,況且事實上也沒有a[size]這個元素
2.既然是數組名的傳遞,當然需要由一個數組的參數來接收,int v[]」的問題是因為他是形式參數,是為了接收數組的
n的問題是因為,如果只傳遞了數組,但是函數並找不到數組的個數,所以需要把數組大小傳遞過來
G. C語言數組作為形參實參的一些疑惑
void fun(int arr[], int n);
在函數定義的時候,形參int arr[]不是表示某個元素的值,而是告訴編譯器第一個參數是一個數組指針,可以接收實參傳過來的數組地址。
實際上以上定義等價於下面的定義。
1.數組裡面帶元素個數:
void fun(int arr[常數], int n);
這里的常數可以是任意正整數,實際上編譯器是會忽略,因為這里只要告訴編譯器我接收的是一個數組指針,至於它有多少個元素不關心,因為實參也只是傳個地址過來。元素個數由參數二控制。至於為什麼要這么約定可以看下面補充說明。
2.void fun(int *arr, int n);
使用指針,這種方式和題目中的方式是最常用的方式,第一種最不常用。
補充說明(為什麼數組作為函數參數是傳地址,而不是傳每個元素):
設想一下,有一個函數如下
int fun(int nums[1000], int size)
它的參數一要處理1000多個元素的數組,如果是傳值即每個元素,那在函數體內是不是就得再申請1000多個整數的內存,還需要把值從實參那裡復制過來,這是非常耗時間的而且沒有必要,因為在內存的某個塊已經存放了這些數據。只要告訴放在哪個位置,你函數體去那裡找就行了。這里說的就是傳地址了,只需要傳個數組首地址,然後告訴有多少個元素要處理就OK了。傳地址只需要復制地址給形參,相對傳每個元素快得多。