看看下面的代碼,這里的價格、數量和金額是主函式的本地引數,我們將它們傳遞給extend,其中PRICE、QUANTITY和金額是函式本地的格式引數。我的問題是,在不使用指標的情況下,無效擴展中的金額變化將如何反映在主函式中。
#include <stdio.h>
void extend(float[] 。float[], double[])。
int main(void){
float price[10] = { 10.62, 14.89, 13.21, 16. 55, 18.62, 9.47, 6. 58, 18.32, 12.15, 3.98 };
float quantity[10] = { 4, 8.5, 6, 8. 35, 9, 15.3, 3, 5。 4, 2.9, 4.8 };
double amount[10] = { 0 };
extend(price, quantity, amount)。
for (int i = 0; i < 10; i ) {
printf("%f", amount[i]) 。
}
return 0。
}
void extend(float PRICE[] 。float QUANTITY[], double amount[]) {
for (int i = 0; i < 10; i ) {
amount[i] = PRICE[i] * QUANTITY[i];
}
uj5u.com熱心網友回復:
你搞錯了。實際上,這個函式使用了指標。這個函式宣告
void extend(float[], float[], double[])。
被編譯器調整為如下宣告
void extend(float *, float *, double *)。
來自C標準(6.7.6.3函式宣告器(包括原型))
7 將引數宣告為''型別的陣列''應被調整為'合格的指標'。 應調整為''限定型別的指標'',其中型別限定詞(如果有的話 是那些在陣列型別派生的[ 和 ]中指定的。 如果關鍵字static也出現在陣列型別派生的[ 和 ]中,那么對于每一次呼叫 型別推導中,那么對于每次對函式的呼叫,相應的實際引數的值應提供對 相應的實際引數應提供對陣列的第一個 的第一個元素,該元素的數量至少是由 size運算式所指定的元素數的第一個元素。
而當該函式被呼叫時,如
extend(price, quantity, amount);
陣列代號price、 quantity和 amount被隱含地轉換為指向其第一個元素的指標。所以事實上,陣列中的元素是通過指向第一個元素的指標間接地通過參考傳遞的。使用指標算術,可以在函式中改變陣列中的元素數量
。amount[i] = PRICE[i] * QUANTITY[i];
來自C標準(6.3.2.1 Lvalues, arrays, and function designators)
3 除了當它是sizeof運算子或單數&.運算子的運算元,或者是一個字串字面的時候。 運算子的運算元,或者是一個用于初始化陣列的字串字面,否則 型別為 "陣列型別 "的運算式被轉換為 "指標型別 "的運算式。 型別為 "陣列型別 "的運算式被轉換為型別為 "指向型別的指標 "的運算式,該運算式指向陣列物件的初始元素。 指向陣列物件的初始元素,并且不是一個lvalue。如果陣列物件 有暫存器存盤類,該行為是未定義的。
請注意,例如這個運算式amount[i]等同于*( amount i )。
來自C標準(6.5.2.1陣列下標)
2 一個后綴運算式后面是方括號中的運算式[] 。 是一個陣列物件的元素的下標指定。下標運算子[]的定義是 下標運算子[]的定義是:E1[E2]與以下內容相同 (*((E1) (E2))。由于轉換規則適用于 二進制 運算子的轉換規則,如果E1是一個陣列物件(等同于一個指向陣列物件初始元素的指標 到陣列物件的初始元素),E2是一個整數。 E1[E2]指定E1的第E2個元素(從零開始計算)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/322413.html
標籤:
