簡體   English   中英

陣列交換功能

[英]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聲明為引用類似於傳遞指針,但是,您只能使用存儲在此內存位置中的值(等效於取消引用指針),而不能更改指針指向的地址。

  1. 定義數組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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM