本文目錄一覽:
- 1、C語言數組作為形參實參的一些疑惑?
- 2、C語言中數組名作為實參傳給被調用的函數時,形參獲得的是什麼
- 3、C語言中,調用函數的實參是數組名,被調用函數的形參可不可以是指針
- 4、C語言中,數組名作為函數調用的實參時,下面敘述正確的是()。
- 5、C語言,二維數組調用時候形參和實參的問題
- 6、C語言關於一維數組做實參的問題
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了。傳地址只需要複製地址給形參,相對傳每個元素快得多。
C語言中數組名作為實參傳給被調用的函數時,形參獲得的是什麼
C語言中數組名作為實參傳給被調用的函數時,形參獲得的是數組的起始地址。
還是用例子說話吧。
#includestdio.h
int *arry(int *a)
{
int *b;
b = a;
int i;
for(i=0;i5;i++)
{
printf(“%d”,a[i]);
} return b;
}
int main()
{
int a[5] = {1,2,3,4,5};
int *c;
int i;
c = arry(a);
for(i=0;i5;i++)
{
printf(“%d”,c[i]);
}
}
主要是通過指針把數組,例如main裡面的a的地址傳入arry函數,然後在arry函數中用一個兼容類型的指針接收地址,然後就可以再這個指針下的地址操作地址上面的數據了。
arry返回的時候也是返回一個指針(地址)。
C語言中,調用函數的實參是數組名,被調用函數的形參可不可以是指針
可以。是數組也行,如:
void f1(int a[])
{
}
void f2(int *p)
{
}
int a[]={1,2,3};
f1(a);
f2(a);
C語言中,數組名作為函數調用的實參時,下面敘述正確的是()。
正確的
B
例如:
f(int data[]);
f(int *data);
其實是等價的,都是一個指針傳遞。上面兩種無論那種都可以傳遞一個數組名,作為實參。
實參傳遞給的數組名,就是數組的首地址。
因此通過數組名,傳遞其實就是把數組的首地址給了形參,因此通過地址就可以改變實參數組相應的值。
C語言,二維數組調用時候形參和實參的問題
int addnn(int a[][n])
數組的下標必須是常數,不能用變量
而且二維數組第二維的大小要和傳遞進來的數組一樣大,因此應改為
int addnn(int a[][1024])
在我的計算機上定義a[1024][1024]數組過大,要改小一點
C語言關於一維數組做實參的問題
參數的兩種形式:
1、傳值:形參只是實參的一個副本,它只存在被調函數中,在被調函數中對形參的改變不會影響實參的值。
2、傳址:形參是實參的一個地址,在被調函數中對形參的改變會影響實參的值。
在c語言中,簡單變量默認是傳值,而數組默認是傳址。
所以出現你所說的一系列怪現象。
好好想一下,若還不明白請留言。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/238967.html