【发布时间】:2017-02-25 04:26:10
【问题描述】:
在网上查了一些教程,我发现了两种不同的 MPI_SEND 用法:
第一个说缓冲区的开始是&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);
我对@987654325@ 很陌生,所以它可能与通过引用/值传递有关。
我的猜测是b 与&b 相同,但在第一种情况下我们使用&a[500],因为我们从数组中间的地址开始??
但是你为什么不能只说a[500] 而不是&a[500]?
【问题讨论】:
-
简短:因为
a[500]将传递元素的值而不是其地址。 -
假设程序还包含一行
void* b = &a[500];,没有魔法发生。 -
b与&b不同。如果b是一个数组,那么&b是一个指向数组的指针,它的语义与指向数组第一个元素的指针不同,尽管MPI_Send唯一感兴趣的东西,即地址,将是相同。如果b是一个指针,那么&b是一个指向指针的指针并带有一个完全不同的地址——将它传递给MPI_Send很可能会导致垃圾或崩溃。另一方面,b等价于&b[0]。有人说数组名衰减为指向数组第一个元素的指针。
标签: c mpi pass-by-reference memory-address