为什么函数参数可以在C中包含地址或变量

Why can function parameter contain addresses or variables in C

在网上查找一些教程后,我注意到两种不同的 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);

我是 C 的新手,所以它可能与按引用/值传递有关。

我的猜测是 b&b 相同,但在第一种情况下我们使用 &a[500] 因为我们从数组中间的地址开始? ?

但是为什么你不能直接说 a[500] 而不是 &a[500]

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

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

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

First things first:&运算符是运算符的地址,而*运算符是解引用运算符。 & 运算符获取操作数的地址,而 * 运算符根据操作数的值获取变量的值。这些运算符彼此相反。在 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.

的第二次调用中传递的地址。