誰能解釋一下這段代碼的功能?指標有點令人困惑,所以我需要一點幫助來理解發生了什么。我知道它在計算總和和絕對差值,但我不明白為什么我們在這里需要指標。請幫助。
#include <iostream>
使用 命名空間 std.com.cn>。
void update(int *a, int *b) {
int sum = *a *b。
int abs = *a - *b;
if (abs < 0) abs *= 1;
cout << sum << '
' << abs。
}
int main() {
int a, b;
int *pa = &a, *pb = &b;
cingt;> a >> b。
update(pa, pb)。
return 0;
}
uj5u.com熱心網友回復:
我不明白為什么我們在這里需要指標
。
我們不需要。這段代碼是不必要的錯綜復雜的。我的最佳猜測是,你的老師正在為他們還沒有給你看的東西做鋪墊。
這里對指標的使用是毫無意義的。沒有雙關的意思。你可以在沒有指標的情況下做同樣的事情。
這并不意味著指標是無用的。它們是非常重要的。但是這段代碼只是......不適合顯示它們的重要性。
uj5u.com熱心網友回復:
你是對的。這是令人困惑的。這段代碼是不必要的困難,在很多方面都是如此。
讓我們來看看。
讓我們來看看發生了什么。函式update(int *a, int *b)需要兩個指向整數的指標作為引數。也就是說,當你呼叫它時,你傳遞了兩個變數的地址,這些變數是ints。該函式對實際的整數進行加減,使用*運算子來dereference指標,也就是說,讀取a和b所指向的實際變數。
沒有必要將引數作為指標傳遞,我對這段代碼所做的第一個改動就是以值傳遞變數。update()需要知道的只是值,而不是變數在記憶體中的位置。(如果它需要改變這些變數的值,那就不一樣了。)呼叫該函式的唯一結果是列印出數值之間的總和和絕對差值,這就是為什么我改變代碼的第二件事是這個函式的名字。
查看main(),我們看到傳遞的引數確實是兩個變數的地址,這兩個變數是通過&運算子的地址獲得的。注意,在main()中定義的變數與update()中的引數被賦予相同的名稱,這可能會引起混淆,因為它們是完全不同的。在一種情況下,它們是整數;在另一種情況下,是指向整數的指標。但是,即使它們是同一型別,它們也會指向記憶體中不同位置的不同變數,而程式員可能會混淆這兩者。因此,我所做的最后一個改變是重新命名這些變數。
void print_sum_difference(int i1。int i2){
int sum = i1 i2。
int abs = i1 - i2。
if (abs < 0) abs *= 1;
cout << sum << '
' << abs。
}
int main() {
int a, b;
cingt;> a >> b。
print_sum_difference(a, b)。
return 0;
}
說了這么多......為什么會使用指標?我猜想,這段代碼是在使用 "通過參考傳遞 "機制的道路上邁出的一步,以允許一個函式修改呼叫代碼中的值。當我們按值傳遞時,就像我上面的代碼一樣,函式被賦予了一個變數的副本。兩個新的整數被制作出來,值被復制,而函式可以使用這些值。如果它改變了它們,main()中的變數就不會被改變。但是在原始代碼中,這些值可能被update()中的代碼所改變,比如*a=0;,這會改變main()中的a的值。
uj5u.com熱心網友回復:
指標有點令人困惑
指標有點令人困惑
那就不要使用指標! 在C 中,你通常可以通過使用參考來避免使用它們
。void update(int& a, int& b) {
int sum = a b。
int abs = a - b。
if (abs < 0) abs *= 1;
cout << sum << '
' << abs。
}
int main() {
int a, b;
cingt;> a >> b。
update(a, b)。
return 0。
}
注意,你的原始代碼和上面的代碼都沒有改變a或b,所以你真的不需要指標或參考你所展示的東西,下面的代碼就可以正常作業:
void update(int a, int b) {
int sum = a b。
int abs = a - b。
if (abs < 0) abs *= 1;
cout << sum << '
' << abs。
}
巧合的是,使用命名空間std;通常是一個糟糕的主意。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/333764.html
標籤:
