为什么函数参数可以在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
.
的第二次调用中传递的地址。
在网上查找一些教程后,我注意到两种不同的 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
.