[英]Swap function for Array
我們擁有的信息:
1)定義數組a[1000]
, a
是指針地址。
2)
void swap(int &c, int &b)
{
c=c+b;
b=c-b;
c=c-b;
}
// this is a method of swapping two variables without using temp variable.
// We use call by reference for the swap to actually take place in memory.
現在,當我為a的兩個條目調用此函數時,說a[i],a[j]
...會發生什么情況? 該函數是否由於C / C ++的內部構造而接收到數組兩個單元的地址,還是接收到指向a[i]
和a[j]
的指針的地址?
a[i]
計算對第i
個元素的引用。 它等效於*(a+i)
,其中a+i
是指向第i
個元素的指針。
引用在內部如何工作是由實現定義的(您不必在意),但是大多數(所有)編譯器在內部使用指針。 在這種情況下,它們將是指向數組中兩個元素的指針。
我想說的是,在幕后它將收到指向a[i]
和a[j]
指針。
在以下兩個程序上運行g++ -S
會產生相同的結果:
#include<iostream>
extern "C" void swap(int&c,int&b){
c=c+b;
b=c-b;
c=c-b;
}
int main(){
int*a=new int[1000];
a[10]=10;
a[42]=42;
swap(a[10],a[42]);
std::cout << a[10] << " " << a[42] << std::endl;
delete[] a;
return 0;
}
和
#include<iostream>
extern "C" void swap(int*c,int*b){
*c=*c+*b;
*b=*c-*b;
*c=*c-*b;
}
int main(){
int*a=new int[1000];
a[10]=10;
a[42]=42;
swap(a+10,a+42);
std::cout << a[10] << " " << a[42] << std::endl;
delete[] a;
return 0;
}
我使用extern "C"
來diff
輸出,否則處理方式有所不同。
旁注,當您編寫例如a+42
,考慮到a
是指向int
的指針,編譯器會將地址計算為a+sizeof(int)*42
。 這個特定的示例在生成的程序集源中顯示為addl $168, %eax
。
A)C和C ++是兩種不同的語言。 給定您的swap(int &c, int &b)
方法定義,它就是C ++
B)因為它是C ++,並且您正在傳遞引用 ,所以您獲得了對數組元素的引用(在內存中位於a + i
)
如果是C,則將您的函數定義為swap(int *c, int *d)
並且將傳遞指針a + i
因為數組會自動降級為指針。
首先,交換函數是個壞主意,因為總和的值可能會溢出。 只需使用一個臨時變量。
當調用swap(a [i],a [j])時,函數的參數是指向存儲位置a [i]和a [j]的兩個指針。 指針包含兩個int的地址。 函數swap()不會將兩個int放在同一數組中。
將c和d聲明為引用類似於傳遞指針,但是,您只能使用存儲在此內存位置中的值(等效於取消引用指針),而不能更改指針指向的地址。
- 定義數組
a[1000]
,a
是指針地址。
不,不是。 a
是一個數組。 在許多情況下,它會衰減到指向第一個元素的指針,但它不是指針的地址(當然,除非您創建了一個指針數組)。
僅當數字之和在值范圍內時才可以交換兩個不帶temp的數字,這種想法很好用;一個int可以保存。(通常為power(2,sizeof(int))),否則會發生溢出。 談到這個問題,
int *a=new int;
a[1000];// if i have understood your question then....
如您在這里所述, A是一個指針, A [i]是一個以A為基地址形成的數組。 在c中,當您內部說p [i]時,它會轉換為*(p + i),其中p是基地址。類似地,當您通過值的引用地址時,也會被傳遞。
注意:引用是隱式常量,引用必須在聲明時賦予值。
引用的行為就像隱式取消引用的const指針一樣,傳遞引用比使用指針安全,因為使用指針可能會導致段錯誤(沒有動態分配內存的地方)
a[i]
代表值,所以&a[i]
= a + i
將被(內部)傳遞。 同樣對於a[j]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.