【问题标题】:Why can function parameter contain addresses or variables in C为什么函数参数可以包含C中的地址或变量
【发布时间】: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);

我对@9​​87654325@ 很陌生,所以它可能与通过引用/值传递有关。

我的猜测是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


【解决方案1】:

&a[500]这个词是a[500]的地址,也就是数组a的第500个元素。所以它是一个指针。

术语b 可以是一个数组(例如int b[1000]),在这种情况下,没有索引,它被转换为指向数组开头的指针(例如&b[0]),或者是一个真正的指针,指向某个数组的开头。

备注:a[500](不带 & 符号)将是第 500 个元素的值。

【讨论】:

  • 非常感谢。有道理
【解决方案2】:

首先:& 操作符是操作符的地址,而* 操作符是解引用操作符。 & 操作符获取操作数的地址,而* 操作符获取操作数值处的变量值。这些运算符彼此相反。在 C 中,数组几乎就像一个指针。指针是一个变量,其中设置了另一个变量的地址。可以找到指针和数组之间的一些区别here 当您执行 int arr[10] 时,您分配了 10 个 ints 的内存,然后将变量 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 时传递的地址。

【讨论】:

  • 非常详细的解释。谢谢
猜你喜欢
  • 2021-02-16
  • 2011-05-11
  • 1970-01-01
  • 2021-10-26
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
相关资源
最近更新 更多