2017-03-12 35 views
4

我正在學習如何實現mergesort的入門C++課程。我想通過在代碼中的每一步走我自己,但有一件被絆倒了我,讓指針算術用作C++函數的參數時發生了什麼?

1. void mergeSort(int *x, int len){ 
2. if (len>1){ 
3. int newLen=len/2; 
4. mergeSort(x, newLen); 
5. mergeSort(x+newLen,len-newLen); 
6. int *newSeq; 
7. newSeq=new int[len]; 
8. mTwoSeq(x, x+newLen, newSeq,newLen, len-newLen); 
9. for(int i=0;i<len;++i){ 
10. x[i]=newSeq[i]; 
11.  } 
12. delete[] newSeq; 
13. } 
14. } 

什麼是在第5行發生了什麼?我的理解是,當我們調用「x + i」,其中x是一個指針數組時,我們要求計算機給我們存儲第i條數據的內存地址。如果是這種情況,我不完全確定這是否適合這裏。如果有人知道該函數調用發生了什麼,我很高興知道。謝謝!

+2

'x'不是一個指針數組。它是一個指向'int'的指針,它可能指向或不指向數組的一個元素。 – juanchopanza

回答

3

第4行和第5行將數組視爲兩個「半部」,然後每個部分都會通過遞歸調用進行排序。第5行(x + newLen)調用的第一個參數是計算(大致)位於數組中間的元素的地址,因爲newLen大約是長度的一半。 (我說「大約」和「約」在這裏,因爲這取決於len初始值是奇數還是偶數。)

你是正確x + newLen使用「指針運算」,因爲x是一個指針。假設在許多/大部分系統上都是如此,您系統上的int的大小爲4個字節,那麼作爲示例,如果newLen是12,則執行x + newLen所產生的指針實際上將是內存中的地址, (因爲指針算術考慮了被指向的元素類型的大小)。這意味着x + newLen指向從數組開始的整數12個點。

最後,上面的評論者正確地糾正你。 x不是指針數組。相反,它是一個指向整數的指針,它大概在要整理的整數數組(或子數組)中的第一個位置。

0

約C++(和C)一種不尋常的是,當你聲明一個數組,像這樣:

INT一個[5];

名稱'a'實際上相當於&(a [0]),該數組的第一個元素的地址。也就是說,當你在表達式中使用'a'時,它是一個指針值,而不是一個變量值。所以你可以使用指針算術就可以了。所以a + 1將相當於&(a [1])。這就是爲什麼這樣的陳述:

int * p = a,* p2 = a + 1;

是允許的。因爲指針可以指向變量和數組元素,所以如果你編寫p [1],編譯器會假設p指向一個數組,在這個例子中它是正確的,所以p [1]和a [ 1]。 *(p2-1)和p2 [-1]在本例中都指向與[0]相同的數組元素。

+0

只有某些表達式執行您描述的轉換; '&a'和'sizeof a'是表達式的例子,不是 –

+0

@ M.M是的,sizeof是一個例外。完全精確和壓倒性的新細節之間的折衷是一個難題。 – WaltK