[英]Passing an array as a parameter in C
為什么這段代碼有效?
#include <stdio.h>
void func(int v[]){
v[0] = 1;
}
int main(){
int v[5] = {0};
func(v);
for (int i = 0; i < 5; i++)
{
printf("%d ", v[i]);
}
}
我從中得到的 output 是“1 0 0 0 0”,但為什么呢? 我沒有傳遞指針,為什么 function 可以更改我的 main 中的數組?
是的,您正在傳遞一個指針。
當你寫void func(int v[])
來聲明你的 function 簽名時,它相當於寫void func(int * v)
。
當您編寫func(v)
來調用您的 function 時,它等效於func(&v[0])
。
本 function 聲明
void func(int v[]){
v[0] = 1;
}
由編譯器調整為聲明
void func(int *v){
v[0] = 1;
}
來自 C 標准(6.7.6.3 Function 聲明符(包括原型))
7將參數聲明為“類型數組”應調整為“類型限定指針”,其中類型限定符(如果有)是在數組類型派生的 [ 和 ] 中指定的那些。 如果關鍵字 static 也出現在數組類型推導的 [ 和 ] 中,那么對於 function 的每次調用,對應的實際參數的值應提供對至少與指定元素一樣多的數組的第一個元素的訪問由大小表達式
另一方面,在這個電話
func(v);
數組指示符v
被隱式轉換為指向其第一個元素的指針。
C 標准(6.3.2.1 Lvalues、arrays 和 function 指示符)
3 除非它是 sizeof 運算符或一元 & 運算符的操作數,或者是用於初始化數組的字符串字面量,否則類型為 ''array of type'' 的表達式將轉換為類型為 ''pointer 的表達式鍵入指向數組 object 的初始元素且不是左值的''。 如果數組 object 具有寄存器存儲 class,則行為未定義。
即 function 調用相當於
func( &v[0] );
所以實際上數組的第一個元素通過指向它的指針通過引用傳遞給 function。 通過下標運算符取消引用指針(表達式v[0]
等價於表達式*v
)
v[0] = 1;
數組中引用的第一個元素被更改。
這是因為數組在內部被視為指針。 它是數組類型變量的標識符,它具有到元素類型指針的隱式轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.