尋找一些在線教程,我注意到兩個不同的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]
?
Short:因爲'a [500]'會傳遞元素的值*而不是其地址。 – usr2564301
假設程序還包含一行'void * b =&a [500];',那麼就沒有魔法了。 –
'b'與'&b'不一樣。如果'b'是一個數組,那麼'&b'是一個指向數組的指針,它與指向數組第一個元素的指針具有不同的語義,儘管唯一感興趣的是MPI_Send,即地址一樣。如果'b'是一個指針,那麼'&b'是一個指向指針的指針並攜帶一個完全不同的地址 - 將它傳遞給'MPI_Send'很可能導致垃圾或崩潰。另一方面,'b'等價於'&b [0]'。一個說數組的名字衰減到指向數組的第一個元素的指針。 –