為什么這段代碼有效?
#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]);
}
}
我從中得到的輸出是 '1 0 0 0 0' 但為什么呢?我沒有傳遞指標,為什么該函式可以更改我的 main 中的陣列?
uj5u.com熱心網友回復:
是的,您正在傳遞一個指標。
當你寫void func(int v[])來宣告你的函式簽名時,就相當于寫了void func(int * v).
當你撰寫func(v)呼叫你的函式時,它相當于func(&v[0]).
uj5u.com熱心網友回復:
這個函式宣告
void func(int v[]){
v[0] = 1;
}
由編譯器調整到宣告
void func(int *v){
v[0] = 1;
}
來自 C 標準(6.7.6.3 函式宣告符(包括原型))
7將引數宣告為“型別陣列”應調整為“型別限定指標”,其中型別限定符(如果有)是在陣列型別派生的 [ 和 ] 中指定的那些。如果關鍵字 static 也出現在陣列型別派生的 [ 和 ] 中,那么對于函式的每次呼叫,相應的實參的值應提供對陣列的第一個元素的訪問,該元素至少與指定的元素一樣多由大小運算式
另一方面,在這個電話中
func(v);
陣列指示符v被隱式轉換為指向其第一個元素的指標。
C 標準(6.3.2.1 左值、陣列和函式指示符)
3 除非它是 sizeof 運算子或一元 & 運算子的運算元,或者是用于初始化陣列的字串文字,否則型別為“array of type”的運算式將轉換為型別為“pointer”的運算式鍵入 '' 指向陣列物件的初始元素并且不是左值。如果陣列物件具有暫存器存盤類,則行為未定義。
即函式呼叫等價于
func( &v[0] );
所以實際上陣列的第一個元素是通過指向它的指標通過參考傳遞給函式的。通過下標運算子解參考指標(運算式v[0]等價于運算式*v)
v[0] = 1;
陣列中參考的第一個元素被更改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/397310.html
