2016-10-15 66 views
2

尋找一些在線教程,我注意到兩個不同的MPI_SEND用途:爲什麼功能參數包含地址或變量用C

第一個說,緩衝區的開始是&a[500]

MPI_Send(&a[500], 500, MPI_INT, 1, 0, MPI_COMM_WORLD); 

第二個說:該緩衝區的開始是b

MPI_Send(b, 500, MPI_INT, 0, 0, MPI_COMM_WORLD); 

我很新的C所以也許它是與通通過參考/價值。

我的猜測是b&b相同,但是在第一種情況下,swe使用&a[500],因爲我們是從一個數組中間的地址開始的?

但是,爲什麼你不能只說a[500]而不是&a[500]

+1

Short:因爲'a [500]'會傳遞元素的值*而不是其地址。 – usr2564301

+0

假設程序還包含一行'void * b =&a [500];',那麼就沒有魔法了。 –

+0

'b'與'&b'不一樣。如果'b'是一個數組,那麼'&b'是一個指向數組的指針,它與指向數組第一個元素的指針具有不同的語義,儘管唯一感興趣的是MPI_Send,即地址一樣。如果'b'是一個指針,那麼'&b'是一個指向指針的指針並攜帶一個完全不同的地址 - 將它傳遞給'MPI_Send'很可能導致垃圾或崩潰。另一方面,'b'等價於'&b [0]'。一個說數組的名字衰減到指向數組的第一個元素的指針。 –

回答

3

術語&a[500]a[500]的地址,即陣列a的第500個元素。所以它是一個指針。

術語b可以是一個陣列(例如int b[1000])在這種情況下,沒有索引,它被轉換爲指針陣列(即&b[0]),或AP實際指針的開始,指向的開始一些數組。

備註:a[500](不含&符號)將是500st元素的值。

+0

非常感謝。有道理 –

4

首先要說的是:&運營商是運營商的地址,而*運營商是解引用運營商。 &運算符獲取操作數的地址,而*運算符獲取操作數值的變量值。這些運營商是相互顛倒的。在C中,數組幾乎就像一個指針。指針是一個變量,其中另一個變量的地址設置爲它。指針和數組之間可以有一些差異here當你做int arr[10]時,你正在分配10 int的內存,然後將變量arr設置爲該分配內存的開始地址。例如:

     |    allocated memory 
        |,---------------------/\-------------------------. 
Address (hex): arr |   012C | 0130 | 0134 | ... | 0170 | 
Value (hex) : 012C | arr[0] or *arr | arr[1] | arr[2] | ... | arr[9] | 

&arr[2] = 0x0134 

一些需要注意的:arr[i]是一樣的*(arr + i)

在您的問題中,您將&a[500]傳遞給MPI_Send。這確實是一個參考。 &a[500]a的第500個元素的地址。第一次致電MPI_Send的地址是一個地址。如果在本教程中,b是指向緩衝區的指針,則存儲在b中的地址是在第二次調用MPI_Send時傳遞的地址。

+0

非常好的詳細解釋。謝謝 –

相關問題